为什么函数x可以访问某些对象的“self”,它不属于??? 请参阅以下代码:
#!/usr/bin/env python
class A(object):
def __init__(self):
self.a = 1
def doit(self):
print self.a
a = A()
x = a.doit
x()
请参阅:
$ ./classes.py
1
$
答案 0 :(得分:4)
如果您致电x()
,它只会解析为调用a.doit()
,访问A
的内容完全没问题。
答案 1 :(得分:1)
它与调用binding
的内容有关。简短而愚蠢的解释:该方法将“记住”(它必然会)创建并在该上下文中运行。
更长的解释是关于闭包是如何做同样的事情,它做的事情就像引用Alonzo Church和一些非常漂亮的东西,如本地定义的函数和类。但是,长期和短期将永远只是回忆其背景。
答案 2 :(得分:0)
当你使用instance.attr
,并且属性是函数时,python会做额外的事情;它将函数作为“方法”返回,并将self
参数预设为实例。如果您改为someclass.attr
;相同的属性,但在类而不是类的实例; python仍将返回一个方法,但没有绑定self
。
>>> class A(object):
... def __init__(self):
... self.a = 1
... def doit(self):
... print self.a
...
>>> A
<class '__main__.A'>
从类
访问的方法>>> A.doit
<unbound method A.doit>
>>> print repr(A.doit.im_self)
None
self
尚未绑定任何内容
A
>>> a = A()
>>> a
<__main__.A object at 0x7fa13456ca50>
self
绑定a.doit
>>> a.doit
<bound method A.doit of <__main__.A object at 0x7fa13456ca50>>
>>> print repr(a.doit.im_self)
<__main__.A object at 0x7fa13456ca50>
它是同一个对象:
>>> a.doit.im_self is a
True