【问题标题】:Use of __getattr__ in Python在 Python 中使用 __getattr__
【发布时间】:2014-06-14 10:52:00
【问题描述】:

在 Python 中,您应该多久使用一次__getattr__,而不是普通方法?

哪些会被认为更好?

class A:
    def __getattr__(self, attribute):
        if attribute == "spam":
            return self._spam * 100
        elif attribute == "eggs":
            return "fried" + self._eggs
        raise AttributeError

class B:
    def get_spam(self):
        return self._spam * 100

    def get_eggs(self):
        return "fried" + self._eggs

【问题讨论】:

  • 我将为此使用@property。
  • 是的,这听起来很完美,谢谢。

标签: python oop coding-style getattr


【解决方案1】:

使用@property decorator,而不是__getattr__ 或访问器方法:

class B(object):
    @property
    def spam(self):
        return self._spam * 100

    @property
    def eggs(self):
        return "fried" + self._eggs

使用__getattr__ 仅支持动态 属性,其中属性的数量和名称在类定义时是未知的。

【讨论】:

  • @Reloader:当属性访问更清晰时,为什么要使用访问器方法?如果一个属性从 API 的角度来看是有意义的(它自然地表现得像一个属性,不带参数并且具有动态特性),为什么要让对象的最终用户显式调用来获取值?
  • @Reloader 功能不一样。我会做a_B.get_spam(),这会做a_B.spam(没有函数调用)。
  • @Reloader:使用属性更符合 Pythonic。如果您需要动态属性,请使用property 提供一个。使用property 最简单的方法是作为装饰器。
  • @Reloader:其值取决于其他因素或状态的属性;通常需要计算的东西。
  • @Reloader:Python 中没有私有或受保护的属性。 所有属性都是公开的。下划线只是一种命名约定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2012-06-01
  • 2020-07-01
相关资源
最近更新 更多