2013-02-20 65 views
0

我真的在這三種方法Python中設置屬性優先和壓倒一切的

setattr() 
__setattr__ 
obj.x = 10 

我有這個測試類之間的混淆

class Test(object): 
    def __init__(self): 
     self.__dict__['x'] = 99 

b = Test() 
#setattr(b,'x',10) 
#b.x = 10 

現在我有兩個問題

BX轉換爲

b.x = 10 --> b.__setattr__(x,10) --> b.__dict__['x'] = 10

和SETATTR(B, 'X',10)也被轉換到

setattr(b,'x',10) --> b.__setattr__(x,10) --> b.__dict__['x'] = 10

然後爲什麼我們使用了另一種

  1. 這是最低級的功能,使得沒有不管如何價值的varaible分配,但我的價值沒有得到chnages要麼b.xsttattr__setattr
+1

你的最後一句話是沒有意義的,請說明你的要求。 – BrenBarn 2013-02-20 05:43:11

+0

我的意思是x的值應該總是10,不管用戶如何賦值 – user192082107 2013-02-20 05:48:33

+0

這個b .__ setattr __(x,10) - > b .__ dict __ ['x'] = 10'不正確。例如見['__slots__'](http://docs.python.org/3.1/reference/datamodel.html?highlight=__slots__#object.__slots__) – 2013-02-20 05:55:49

回答

0

當您提前知道(即編寫程序時),您使用b.x = 10分配給哪個屬性。如果您不知道(例如,如果您正在從文件讀取配置信息或執行某種動態編程),則可以使用setattr

你永遠不會字面上做setattr(b, 'x', 10),因爲如果你可以在那裏鍵入一個文字x,你可以剛剛完成b.x = 10並保存了一些輸入。你會使用setattr類似:

optionName, optionValue = readConfigFile() 
setattr(configObject, optionName, optionValue) 

也就是說,你使用它時,你不知道,直到運行時什麼屬性你會被分配給。例如,這可能是因爲它依賴於外部資源(如我的示例)或用戶輸入。

0

通常的方法是

b.x = 10 

如果你事先不知道屬性名稱

attr_name = 'x' 
setattr(b, attr_name, 10) 

是一個很好的方式說同樣的話。

這不是設置b上屬性的好方法。

b.__dict__['x'] = 10 

如你假設b__dict__屬性(但不是所有對象做)

+0

然後當我可以在類中使用'__setattr__'。任何使用案例 – user192082107 2013-02-20 05:49:43

+0

@ user2082226。 'setattr(b,...)'調用'Test .__ setattr __(b,...)' – 2013-02-20 05:53:20

+0

我可以在setattr中提到classname,而不是對象實例,這樣我就可以指定class屬性而不是實例屬性 – user192082107 2013-02-20 05:57:05