为什么从类复制的Python函数从外部访问类数据?

时间:2011-09-12 21:09:37

标签: python

为什么函数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
$ 

3 个答案:

答案 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
相关问题