7

考虑这样的代码:

class A ():
   name = 7
   description = 8
   color = 9

class B(A):
   pass

B 类现在具有(继承)A 类的所有属性。出于某种原因,我希望 B 不继承属性“颜色”。有可能这样做吗?
是的,我知道,我可以首先创建具有属性“名称”和“描述”的 B 类,然后从 B 添加属性“颜色”继承 A 类。但在我的确切情况下,B 实际上是 A 的简化版本,所以对我来说,删除 B 中的属性(如果可能的话)似乎更合乎逻辑。

4

2 回答 2

9

我认为最好的解决方案是改变你的类层次结构,这样你就可以得到你想要的类,而不需要任何花哨的技巧。

但是,如果您有充分的理由不这样做,您可以使用描述符color隐藏属性。 您需要使用新的样式类才能使其工作。

class A(object):
    name = 7
    description = 8
    color = 9

class Hider(object):
    def __get__(self,instance,owner):
        raise AttributeError, "Hidden attribute"

    def __set__(self, obj, val):
        raise AttributeError, "Hidden attribute"

class B(A):
    color = Hider()

AttributeError然后,当您尝试使用该color属性时,您会得到一个:

>>> B.color
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __get__
AttributeError: Hidden attribute
>>> instance = B()
>>> instance.color
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __get__
AttributeError: Hidden attribute
>>> instance.color = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in __set__
AttributeError: Hidden attribute
于 2010-09-09T09:01:36.293 回答
8

您可以为 B 提供不同的值color,但如果您希望 B 不具有 A 的某些属性,那么只有一种干净的方法可以做到这一点:创建一个新的基类。

class Base():
    name = 7
    description = 8

class A(Base):
    color = 9

class B(Base):
    pass
于 2010-09-09T07:55:01.400 回答