在实例化期间更改 __getattr__

der*_*icw 5 python

我想__getattr__在类的实例化过程中进行更改。例如:

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

    def _getattr(self, attr):
        print("Getting {}".format(attr))
Run Code Online (Sandbox Code Playgroud)

我本以为这会表现得像:

class AttrTest(object):
    def __getattr__(self, attr):
        print("Getting {}".format(attr))
Run Code Online (Sandbox Code Playgroud)

但事实并非如此。

例如,当我运行时:

>>> at = AttrTest()
>>> at.test
Run Code Online (Sandbox Code Playgroud)

我希望两个类都能打印Getting test,但顶级类会抛出一个AttributeError.

就不能__getattr__这样改吗?

wim*_*wim 2

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

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

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

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