如何仅获取当前类的属性而不来自父类?
如何只从当前类获取一个属性,而不去查找可能的父类?如果我使用 getattr
,它会沿着类的层级结构查找,但我希望如果这个属性在当前类中没有定义,就返回 None
(即使在某个父类中定义了这个属性)。
3 个回答
0
没有什么能阻止你在初始化时把那个属性重置为 None,前提是你在初始化父类之后这样做(在 Python 中,继承的类叫做子类,提供功能的类叫做父类,不是简单的父母关系)。
除非那个属性是在别的地方创建的,并且它的存在并不一定,这种情况下你可能需要向上查找继承关系,这时候可能会出现一些严重的设计问题哦 :)
总的来说,这些方法只是解决问题的权宜之计,我同意你可能需要解决一些设计上的问题。
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
不过,我觉得你最好重新考虑一下这个方法。
4
这个答案不是绝对正确的(比如,对于使用了 __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