Python:怎样通过阅读名字 “人眼” 判断其为对象的属性还是方法( 三 )
2.5. 函数(function)
这里特指非内建的函数。注意,在类中使用def定义的是方法,方法与函数虽然有相似的行为,但它们是不同的概念。
__doc__: 函数的文档;另外也可以用属性名func_doc。 __name__: 函数定义时的函数名;另外也可以用属性名func_name。 *__module__: 包含该函数定义的模块名;同样注意,是模块名而不是模块对象。 *__dict__: 函数的可用属性;另外也可以用属性名func_dict。 不要忘了函数也是对象,可以使用函数.属性名访问属性(赋值时如果属性不存在将新增一个),或使用内置函数has/get/setattr()访问。不过,在函数中保存属性的意义并不大。 func_defaults: 这个属性保存了函数的参数默认值元组;因为默认值总是靠后的参数才有,所以不使用字典的形式也是可以与参数对应上的。 func_code: 这个属性指向一个该函数对应的code对象,code对象中定义了其他的一些特殊属性,将在下文中另外介绍。 func_globals: 这个属性指向当前的全局命名空间而不是定义函数时的全局命名空间,用处不大,并且是只读的。 *func_closure: 这个属性仅当函数是一个闭包时有效,指向一个保存了所引用到的外部函数的变量cell的元组,如果该函数不是一个内部函数,则始终为None。这个属性也是只读的。
下面的代码演示了func_closure:
?123456789101112#coding: UTF-8def foo():n = 1def bar():print n # 引用非全局的外部变量n,构造一个闭包n = 2return bar closure = foo()print closure.func_closure# 使用dir()得知cell对象有一个cell_contents属性可以获得值print closure.func_closure.cell_contents # 2
由这个例子可以看到,遇到未知的对象使用dir()是一个很好的主意 :)2.6. 方法(method)
方法虽然不是函数,但可以理解为在函数外面加了一层外壳;拿到方法里实际的函数以后,就可以使用2.5节的属性了。
__doc__: 与函数相同。 __name__: 与函数相同。 *__module__: 与函数相同。 im_func: 使用这个属性可以拿到方法里实际的函数对象的引用。另外如果是2.6以上的版本,还可以使用属性名__func__。 im_self: 如果是绑定的(bound),则指向调用该方法的类(如果是类方法)或实例(如果是实例方法),否则为None。如果是2.6以上的版本,还可以使用属性名__self__。 im_class: 实际调用该方法的类,或实际调用该方法的实例的类。注意不是方法的定义所在的类,如果有继承关系的话。
?1234im = cat.sayHiprint im.im_funcprint im.im_self # catprint im.im_class # Cat
这里讨论的是一般的实例方法,另外还有两种特殊的方法分别是类方法(classmethod)和静态方法(staticmethod)。类方法还是方法,不过因为需要使用类名调用,所以他始终是绑定的;而静态方法可以看成是在类的命名空间里的函数(需要使用类名调用的函数),它只能使用函数的属性,不能使用方法的属性。2.7. 生成器(generator)
生成器是调用一个生成器函数(generator function)返回的对象,多用于集合对象的迭代。
__iter__: 仅仅是一个可迭代的标记。 gi_code: 生成器对应的code对象。 gi_frame: 生成器对应的frame对象。 gi_running: 生成器函数是否在执行。生成器函数在yield以后、执行yield的下一行代码前处于frozen状态,此时这个属性的值为0。 next|close|send|throw: 这是几个可调用的方法,并不包含元数据信息,如何使用可以查看生成器的相关文档。
?123456789101112def gen():for n in xrange(5):yield ng = gen()print g # \u0026lt;generator object gen at 0x...\u0026gt;print g.gi_code # \u0026lt;code object gen at 0x...\u0026gt;print g.gi_frame # \u0026lt;frame object at 0x...\u0026gt;print g.gi_running # 0print g.next() # 0print g.next() # 1for n in g:print n, # 2 3 4
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 船舶■江苏镇江谏壁船闸2020年船舶通过量近2亿吨
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 红米手机通过QQ空间的成功营销,给涉足社会化营销的企业有哪些启示
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
