Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1100156
  • 博文数量: 165
  • 博客积分: 5957
  • 博客等级: 大校
  • 技术积分: 2015
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-24 15:04
文章分类

全部博文(165)

文章存档

2014年(10)

2013年(14)

2012年(9)

2011年(22)

2010年(17)

2009年(17)

2008年(26)

2007年(34)

2006年(16)

我的朋友

分类: LINUX

2008-07-11 13:50:49

自省

    自省是指代码可以查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作。用这种方法, 你可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用事先并不知道名称的函数。自省的核心是getattr函数
   

>>> li = ["Larry", "Curly"]
>>> li.pop <built-in method pop of list object at 010DF884>
>>> getattr(li, "pop") <built-in method pop of list object at 010DF884>
>>> getattr(li, "append")("Moe")>>> li
["Larry", "Curly", "Moe"]
>>> getattr({}, "clear") <built-in method clear of dictionary object at 00F113D4>
>>> getattr((), "pop")
Traceback (innermost last):
  File "", line 1, in ?
AttributeError: 'tuple' object has no attribute 'pop'

li.pop是获取列表的 pop 方法的引用。注意该语句并不是调用 pop 方法;调用 pop 方法的应该是 li.pop()。这里指的是方法对象本身。

getattr 是一个有用到令人无法致信的内置函数,可以返回任何对象的任何属性,它的返回值是方法。

然后你就可以调用它就像直接使用 li.append("Moe") 一样。但是实际上你没有直接调用函数;只是以字符串形式指定了函数名称。

让我们假设有一个以 HTMLXML 和普通文本格式打印站点统计的程序。输出格式在命令行中指定,或者保存在配置文件中。statsout 模块定义了三个函数:output_htmloutput_xmloutput_text。然后主程序定义了唯一的输出函数,如下:

import statsout

def output(data, format="text"): 
    output_function = getattr(statsout, "output_%s" % format) 
    return output_function(data) 

可以连接 format 参数值和 "output_" 来创建一个函数名称作为参数值,然后从 statsout 模块中取得该函数。这种方式允许今后很容易的扩展程序以支持其它的输出格式,而且无需修改分发函数。所要做的仅仅是向 statsout 中添加一个函数,比如 output_pdf,之后只要将 “pdf” 作为 format 的参数值传递给 output 函数即可。

现在可以简单的调用输出函数就像调用其它函数一样了。output_function 变量是指向 statsout 模块中相应函数的引用。

但这里还存在一个问题,即字符串和函数之间的松耦合,而且没有错误检查。如果用户传入一个格式参数,但是在 statsout 中没有定义相应的格式输出函数,会发生什么呢?还好,getattr 会返回 None,它会取代一个有效函数并被赋值给 output_function,然后下一行调用函数的语句将会失败并抛出一个异常。----getattr 能够使用可选的第三个参数,一个缺省返回值。

import statsout

def output(data, format="text"):
    output_function = getattr(statsout, "output_%s" % format, statsout.output_text)
    return output_function(data)

这个函数调用一定可以工作,因为你在调用 getattr 时添加了第三个参数。第三个参数是一个缺省返回值,如果第二个参数指定的属性或者方法没能找到,则将返回这个缺省返回值。

 

阅读(1923) | 评论(0) | 转发(0) |
0

上一篇:被8个鸡蛋打败的爱情

下一篇:变量

给主人留下些什么吧!~~