我正在尝试访问成员函数的属性,但我无法理解为什么我只能通过__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?
答案 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