如何从当前类而不是可能的父类获取属性?如果我使用getattr
它会遍历类层次结构但我希望得到None
如果当前类中没有定义属性(即使它是在某个父类中定义的)。
答案 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并且无法保证其存在,否则只有在这种情况下走上继承树,此时您可能会遇到一些严重的设计问题:)
所有这些都说,这些都是穷人解决问题的方法,我同意你可能会遇到一些设计问题。