如何在__getattr__方法中获取属性?

时间:2018-01-22 20:02:24

标签: python metaprogramming

我需要覆盖__getattr__方法,但是如何在那里获取属性?

我可以使用__getattr__方法访问属性,如下所示:

class Someclass:
    @property
    def some_prop(self):
        return something

    def __getattr__(self, attr_name):
        return self.__dict__[attr_name]

但如果attr_name == 'some_prop',如何在那里访问some_prop那么它将不起作用?

编辑:这不是关于如何解决'2 + 2 = x'的问题,这是关于python中元编程的问题,提供的示例仅用于说明问题

1 个答案:

答案 0 :(得分:2)

你试过self.some_prop()吗? 因为它有效。

但是self.__class__.some_prop.__get__(self, self.__class__)如果你只是想以不同的方式做到这一点。

除此之外,您知道__getattr__没有被instance.some_prop的参考作为参考,对吧?由于描述符存在,因此不会调用__getattr__。 (另外,这就是它起作用的原因)。

如果您需要拦截instance.some_prop本身的引用,则需要实现__getattribute__ - 无条件地要求所有您的属性引用。

在这种情况下,我建议您无条件地致电super().__getattribute__,然后检查该属性是否为some_prop。如果没有,只需返回原始值。