函数x如何访问某个对象的“自我”,它不是? 请看下面的代码:为什么从类复制的Python函数从外部访问类数据?
#!/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
$
函数x如何访问某个对象的“自我”,它不是? 请看下面的代码:为什么从类复制的Python函数从外部访问类数据?
#!/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
$
如果你打电话x()
,它只是解决了调用a.doit()
,这是一点问题都没有访问的A
内容。
它与什么叫binding
有关。简短而愚蠢的解释:该方法将“记住”(它必然会)在那里创建并运行的地方。
关于闭包如何做同样的事情的更长的解释,它做了像Alonzo Church和一些非常漂亮的东西,如本地定义的函数和类的东西。但是,多头和空头永远只是回想它的背景。
当您使用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
'X = a.doit'不是任何东西 “复制”。是什么让你认为它是一个副本?你在哪里见过这样的代码,表示正在制作副本?什么导致你相信有复制进入? –