在子类中阻止特定属性的继承?

时间:2016-08-12 00:54:35

标签: python-3.x inheritance

如果我有以下内容:

class A:
    attrs = [...]
    A_attr = [...]

class B(A):
    B_attr = [...]

有没有办法阻止我的B子类继承A_attr类的A

或者这会被认为是一个糟糕的设计,我应该更好地从包含所有A属性的第三个B类中继承Cattrs并添加特定的像这样属于每个子类?

class C:
    attrs = [...]

class A(C):
    A_attr = [...]

class B(C):
    B_attr = [...]

1 个答案:

答案 0 :(得分:0)

更好的想法是将常用功能转储到类中。

class Commmon:
    attrs = [...]

扩展这个想要这种额外功能的课程。

class A(Common):
    # only one attribute added in this class
    A_attr = [...]

classB(Common):
    attrs_B = [...]

在类中需要额外属性时扩展类A,这将带来所有其他属性。

class C(A):
    attrs_C = [...]

这将允许您希望类型为Common的对象的任何地方,您可以提供B以及C的实例。无论您想要哪个类A的实例,都可以提供C的实例。 如果您在每个子类中添加特定实例,则无法执行此操作。

来自评论

  

所以根据你的说法,我应该使用我在问题中公开的第二个解决方案。

我建议不要在每个子类中添加属性,而是将属性添加到单独的类中,让新类继承此中间类。因此,您不必在每个子类中添加特定属性。

上面已经提供了示例。让我们看看这样做有什么好处,而不是你的建议。采取以下功能

def foo(obj):
    # check to make sure object has the specific attribute
    if (isinstance(obj, A)):
        pass; #do something
    else:
        raise TypeError("Object is not an instance of A")

但是如果我们在每个类中添加特定属性,则需要将该方法更改为:

def foo(obj):
    # check to make sure object has the those type which has that specific attribute
    if( isinstance(obj, class1) or (isinstance(obj, class2) or ...):
        pass; #do something
    else:
        raise TypeError("Object does not have specific attribute")

当然,您可以使用以下内容执行检查:

def foo(obj):
    # check to make sure obj has attribute
    if hasattr(obj, 'property')
        pass; # do something
    else:
        raise TypeError("Object does not have necessary attribute")

使用正确的继承关系(如第一个示例所示)也可以帮助IDE(如果使用的话)推断类型,因为IDE可以确定它所期望的对象类型。你可以甚至用这样的类型信息扩充函数:

def foo(obj : A):
    pass; #do something

冒号后A提示IDE,该函数需要类型或子类型为A的对象。