class _C:
def _m(self): pass
c = _C()
c._m
<bound method _C._m of <__builtin__._C instance at 0x0383C440>>
_C._m
<unbound method _C._m>
_C.__dict__['_m']
<function _m at 0x0394D770>
==========================================
type(_C.__dict__['_m'])
<type 'function'>
type(_C._m)
<type 'instancemethod'>
type(c._m)
<type 'instancemethod'>
==========================================
func
<unbound method GeneratorContextManager.__init__>
func.im_func
<function __init__ at 0x033F7F70>
func.im_self is None
True # 因为这是一个unbound method
func.im_class
<class 'contextlib.GeneratorContextManager'>
实际上类的方法都会被转换为非数据型描述符
def demo_function(*args,**kwargs):
print args,kwargs
class FooClass(object):
def demo_method(self):
pass
demo_method2 = demo_function
foo_instance = FooClass()
print FooClass.__dict__['demo_method2']() #什么输出都没有
print FooClass.demo_method2() # 报错TypeError: unbound method demo_function() must be called with FooClass instance as first argument (got nothing instead)也就是说,python回去检查第一个参数是什么
print FooClass.demo_method2(foo_instance )
print foo_instance.demo_method2()
网友评论