【问题标题】:How to get property in __getattr__ method?如何在 __getattr__ 方法中获取属性?
【发布时间】:2018-01-22 20:02:24
【问题描述】:

我需要重写__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 中元编程的问题,提供的示例只是为了说明问题 p>

【问题讨论】:

  • 属性属于该类,因此您还必须检查 type(self).__dict__ 以获取可能的属性
  • 但是既然这已经是默认行为,你为什么要这样做?
  • @DanielRoseman 因为我需要重写它来执行一些复杂的元编程,提供的示例只是为了这个问题而这似乎不是默认行为,因为没有 'some_prop ' 在 .__dict__

标签: python metaprogramming


【解决方案1】:

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

如果你只是想以不同的方式做,也可以self.__class__.some_prop.__get__(self, self.__class__)

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

如果您需要截取instance.some_prop 本身的引用,则需要实现__getattribute__ - 这对于所有您的属性引用无条件调用。

在这种情况下,我建议直接无条件调用super().__getattribute__,然后检查属性是否为some_prop。如果没有,则返回原始值。

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2014-10-27
    • 2013-12-05
    • 2021-09-27
    • 2011-07-25
    相关资源
    最近更新 更多