如何仅获取当前类的属性而不来自父类?

5 投票
3 回答
2322 浏览
提问于 2025-04-16 01:32

如何只从当前类获取一个属性,而不去查找可能的父类?如果我使用 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

撰写回答