在实例化期间更改__getattr__

时间:2016-09-07 21:34:26

标签: python

我希望在实例化类时更改__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__不能改变吗?

1 个答案:

答案 0 :(得分:3)

对于像__getattr__这样的特殊方法,Python会在基础__dict__中搜索,而不是在实例__dict__中搜索。

您可以在数据模型文档的special lookup部分中阅读有关此内容的更多详细信息。

  

我有两个__getattr__的实现,每个都使用不同的实现   序列化的类型(json,pickle),我希望我的课能够   根据kwarg选择一个。

这不是覆盖__getattr__的好用例。放弃这个想法,而是考虑使用@propertydescriptors动态处理序列化。