2016-09-07 72 views
4

我想在類的實例化期間更改__getattr__。例如:在實例化期間更改__getattr__

class AttrTest(object): 
    def __init__(self): 
     self.__getattr__ = self._getattr 

    def _getattr(self, attr): 
     print("Getting {}".format(attr)) 

我本來期望這表現得像:

class AttrTest(object): 
    def __getattr__(self, attr): 
     print("Getting {}".format(attr)) 

但事實並非如此。

例如,當我運行:

>>> at = AttrTest() 
>>> at.test 

我希望這兩個類打印Getting test,但頂級拋出AttributeError

__getattr__可不可以這樣更改嗎?

+0

我的回答問題自然是「爲什麼?」 –

+0

@WayneWerner好吧,我有'__getattr__'的兩個實現,每個都使用不同類型的序列化(json,pickle),我希望我的類能夠在基於kwarg的實例化中選擇一個。 – ballsatballsdotballs

+0

爲什麼不是子類?據推測,來電者知道哪些是因爲他們正在設置kwarg –

回答

3

對於像__getattr__這樣的特殊方法,Python在基地__dict__中進行搜索,而不是在__dict__實例中進行搜索。

您可以在數據模型文檔的special lookup部分閱讀關於此的更多詳細信息。

我有__getattr__每一位使用不同 型系列化(JSON,鹹菜)的兩個實現,我想我的同班同學能夠 根據kwarg選擇之一。

這不是一個很好的用例來覆蓋__getattr__。放棄這個想法,而是考慮使用@propertydescriptors來動態處理你的序列化。

+1

TIL ...這! :) –

+0

@ballsatballsdotballs - 你可以有'__getattr__'調用'_getattr'根據initization參數設置爲'_getattrjson'或'_getattrpickle'嗎? – mgilson

+0

@mgilson這會工作,是的。 – ballsatballsdotballs