没有超类属性的类属性

时间:2014-06-10 20:53:33

标签: python method-resolution-order

我有一个继承层次结构,其中一些类具有一个名为例如' pickle'的类属性。如果它存在,我想得到A.pickled或如果不存在则得到无 - 即使A派生自许多类,例如B和B.pickled存在(或不存在)。

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

2 个答案:

答案 0 :(得分:2)

要绕过__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。

答案 1 :(得分:0)

我不确定,但也许

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