2017-10-08 77 views
0

這個程序的工作,但是當我刪除GETATTRSETATTR,那麼問題就來了,和ID,名稱不能被發現。 爲什麼會發生這種情況,程序什麼時候運行setattr?我使用了調試模式,並且開玩笑,但它沒有進入函數。Python函數__setattr__和__getattr__

謝謝!

class E(dict): 
    def __getattr__(self, key): 
     try: 
      return self[key] 
     except KeyError: 
      raise AttributeError(r"'Model' object has no attribute '%s'" % key) 

    def __setattr__(self, key, value): 
     self[key] = value 

e = E(id='123', name='abc') 
print(e.id) 
print(e.name) 
+0

'__getattr__'使您可以使用點符號訪問鍵,刪除__getattr__,您仍然可以使用E作爲常規詞典e ['id']', '__setattr__'並不重要,因爲dict超類具有'__setattr__'的自己定義。 – abccd

回答

-1

每個從字典繼承對象必須實現__ GETATTR __ __和__ SETATTR __,在__ SETATTR當您使用[] __叫,如E [「鍵1 「] =」bla bla「

+0

不可以 - '__getattr__' /'__s etattr__'在這裏被用來通過鍵來實現字典的屬性查找,而不是索引查找 - 它們在執行該角色之外不是*必需的。 –

+0

當你創建類似於對象的對象時,我假設你想使用按鍵而不是索引來查找,也就是說,如果你想像真正的字典一樣使用你的對象。所以是的 - 他們是必需的。 – ddor254

+1

錯誤再次 - 沒有。你可以使用'self ['x']'或'self [1]'或者'__getitem__'實現的任何東西 - 實現'__getattr__'允許定製在使用'obj.x'之類的情況下會發生什麼,其中'x '不是已經存在於該物體上的屬性... –

相關問題