2016-03-28 134 views
1

我是Python的新手。最近,我一直在閱讀Python類的內置方法。這裏的問題是:'NoneType'對象在定義時不支持項目分配__getattribute__方法

class Test: 
    def __setattr__(self, key, value): 
     self.__dict__[key] = value 

    def __getattribute__(self, item): 
     pass 

if __name__ == '__main__': 
     T = Test() 
     setattr(T, 'xx', 33) 
     print(getattr(T, 'xx')) 

當我運行該腳本,我得到錯誤信息:

TypeError: 'NoneType' object does not support item assignment 

但是當我刪除了__getattribute__方法,一切運行良好。 我不知道這是怎麼發生的。爲什麼__getattribute__方法會影響我的對象T的數據類型?

+0

它工作正常,在蟒蛇2.但是在Python 3中出現錯誤! –

回答

0

您正在覆蓋默認的__getattribute__方法。 pass裏面的方法定義會返回None。

因此,因此,當getattr(T, 'xx')被稱爲內部的overrided方法被調用返回None

+0

但是當執行'setattr(T,'xx',33)',還沒有到達行'print(getattr(T,'xx'))' – hallblazzar

+0

是的時候發生異常是的,因爲你被覆蓋的方法正在返回None 。刪除該方法以避免異常。 –

1

這是因爲__getattribute__方法總是在嘗試得到一個對象的屬性,叫做:

t=Test() 
print(t.attribute) 

但在你裏面__setattr__你用的方法__getattribute__

def __setattr__(self, key, value): 
    self.__dict__[key]=value #__getattribute__("__dict__") is called 

getattribute返回None(pass什麼都不做,因此它默認返回None) 然後您嘗試將項目分配給None,但這不起作用,因此出現異常。 我希望現在一切都清楚

問候,MrP01 :)

+0

注意:item賦值意味着'obj [key] = value',但setattr意味着'obj.key = value' – MrP01

+0

現在我明白了。謝謝MrP01 !!! – hallblazzar

相關問題