如何从当前类而不是可能的父类获取属性?

时间:2010-07-19 21:27:12

标签: python django object

如何从当前类而不是可能的父类获取属性?如果我使用getattr它会遍历类层次结构但我希望得到None如果当前类中没有定义属性(即使它是在某个父类中定义的)。

3 个答案:

答案 0 :(得分:3)

这不是100%的证明答案(例如,它不适用于使用__slots__的类),但在大多数情况下都可以使用:

>>> class A(object):
...    x = 42
...    y = 43
... 
>>> class B(A):
...    x = 11
... 
>>> b = B()

您可以直接检查类中是否定义了属性:

>>> 'x' in b.__class__.__dict__
True
>>> 'y' in b.__class__.__dict__
False

现在回答你的问题:

# comment explaining why this unusual check is necessary
if 'attribute' in instance.__class__.__dict__:
    value = instance.attribute
else:
    value = None

答案 1 :(得分:0)

你有点用自己的规则把自己画成一个角落。听起来更像是一个设计缺点而不是Python的语言或类问题,因为python的功能是删除和隐藏类继承的复杂性。

您可能需要满足于这样的“替代”解决方案:

class Parent(object):
    property_on_parent = 'default value'
    @property
    def property_accessor(self):
        return self.property_on_parent

class Child(Parent):
    property_on_child = None
    @property
    def property_accessor(self):
        return self.property_on_child

c = Child()
assert c.property_accessor == None

但是,我觉得你最好重新考虑这种方法。

答案 2 :(得分:0)

在初始化super之后,没有任何东西阻止你“重置”init中的atit设置为None(在继承和继承的Python类中是super和sub btw,而不是父和子)。

除非在其他地方创建了attrib并且无法保证其存在,否则只有在这种情况下走上继承树,此时您可能会遇到一些严重的设计问题:)

所有这些都说,这些都是穷人解决问题的方法,我同意你可能会遇到一些设计问题。