【问题标题】:Class properties without superclass properties没有超类属性的类属性
【发布时间】:2014-06-10 20:53:32
【问题描述】:

我有一个继承层次结构,其中一些类有一个名为“pickled”的类属性。我想得到A.pickled(如果存在)或 None(如果不存在)——即使 A 派生自许多类,包括例如 B 和 B.pickled 存在(或不存在)。

现在我的解决方案抓取A__mro__。如果可能的话,我想要一个更清洁的解决方案。

【问题讨论】:

  • 你想解决什么问题?
  • @IfLoop 我正在使用类属性来自动腌制特定属性。我还使用另一个类属性来自动生成用户界面,并使用更多类属性来自动生成参数值的历史记录。你有更好的解决方案吗?

标签: python method-resolution-order


【解决方案1】:

要绕过__mro__的正常搜索,直接查看类的属性字典。您可以为此使用vars() function

return vars(cls).get('pickled', None)

您也可以直接访问__dict__ 属性:

return cls.__dict__.get('pickled', None)

但使用内置函数优于直接访问双下划线属性字典。

object.__getattribute__ 是用于查看类属性的错误方法;见What is the difference between type.__getattribute__ and object.__getattribute__?

type.__getattribute__ 用于对类进行属性访问,但这仍然会搜索 MRO。

【讨论】:

  • 非常感谢。我们很幸运有您加入 Stackoverflow。
【解决方案2】:

我不确定,但也许

try:
    return object.__getattribute__(cls, 'pickled')
except AttributeError:
    return None

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多