2012-07-29 35 views
2

我试图访问成员函数的属性,但我不明白为什么我只能通过__dict__访问。python:如何访问函数的属性

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?

+1

您正试图在类定义中的方法添加属性? – jdi 2012-07-29 22:00:50

+1

为什么你要这个? – geoffspear 2012-07-29 22:01:10

+1

我想这是因为它是一个Python功能。 在开始时我做了类似的事情,当我希望派生类设置其方法之一的属性时。 我需要正确的答案。 – jimifiki 2012-07-29 22:04:11

回答

3

由于instancemethod对象的实现方式。他们使用不允许访问非标准属性的非标准属性获取器。

+1

这就是我想要的答案。你能告诉我在哪里可以读更多吗?我也想知道什么是非标准属性。没有人告诉我这个概念! – jimifiki 2012-07-29 22:07:51

+0

在这里阅读http:// stackoverflow。com/questions/7891277/why-does-set-set-fail-on-a-bound-method – jdi 2012-07-29 22:10:36

+0

该链接暗示它没有一定数量的属性。而是无法在绑定或未绑定的方法上做到这一点。 – jdi 2012-07-29 22:11:20

2

不知道为什么你会永远这样做,但是......

A.fA实际上是一个完全独立的对象VS的官能团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__混淆)。

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

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

不是每个人都对此表示赞同。看看这个其他SO问题:Python function attributes - uses and abuses