2011-09-12 43 views
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 
$ 
+0

'X = a.doit'不是任何东西 “复制”。是什么让你认为它是一个副本?你在哪里见过这样的代码,表示正在制作副本?什么导致你相信有复制进入? –

回答

4

如果你打电话x(),它只是解决了调用a.doit(),这是一点问题都没有访问的A内容。

1

它与什么叫binding有关。简短而愚蠢的解释:该方法将“记住”(它必然会)在那里创建并运行的地方。

关于闭包如何做同样的事情的更长的解释,它做了像Alonzo Church和一些非常漂亮的东西,如本地定义的函数和类的东西。但是,多头和空头永远只是回想它的背景。

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