2012-07-29 34 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