python:如何访问函数的属性

时间:2012-07-29 21:54:26

标签: python lookup member-functions

我正在尝试访问成员函数的属性,但我无法理解为什么我只能通过__dict__访问。

class A(object):
    def fA(self):
        print A.fA.x 
    fA.x = 2

A.fA.__dict__['x'] = 3 
#A.fa.x #AttributeError: 'instancemethod' object has no attribute 'x'
A.fA.x = 4 

如果我尝试“直接”访问,为什么会出现AttributeError?

2 个答案:

答案 0 :(得分:3)

由于instancemethod对象的实现方式。它们使用非标准的属性getter,它不允许访问非标准属性。

答案 1 :(得分:2)

不确定你为什么要这样做,但是......

A.fA实际上是一个完全独立的对象与函数fA。观看:

>>> class A(object):
...   def fA(self): pass
...   print fA
... 
<function fA at 0x10f1c2a28>
>>> A.fA
<unbound method A.fA>

如您所见,A.fA是一种“未绑定的方法”,而不是一种功能。 “未绑定”表示它与任何实例无关;而绑定方法与特定实例相关联。观察:

>>> A().fA
<bound method A.fA of <__main__.A object at 0x10f1d3d10>>

无论哪种方式,方法都会包含实现它们的函数:

>>> A.fA.im_func
<function fA at 0x10f1c2a28>

请注意,该地址与之前打印的地址相同。

奇怪的是,我无法重复你所看到的行为:

>>> A.fA.__dict__['x'] = 1
>>> A.fA.x
1

也许,这种差异是由于不同版本的python造成的。这是我的:

$ python
Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

PS:A.fA.x似乎对我和A.fA.im_func.x一样有效,这让我感到惊讶......再一次,我对你为什么要这样做感到有点怀疑。通常,您使用__dict__的唯一时间是您实施__getattr__(不要与__getattribute__混淆)。

给予对象(尤其是基本类型的)ad-hoc属性也是一个好主意。通常可行的替代方案是使用您自己的地图,例如

>>> def foo(): pass
... 
>>> my_x_values = {foo: 'X'}
>>> my_x_values[foo]
'X'

虽然不是每个人都同意这一点。查看其他SO问题:Python function attributes - uses and abuses