2016-08-12 77 views
0

如果我有以下几点:在子类中防止特定属性的继承?

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

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

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

还是将这个被认为是不好的设计,我应该更好地从子类包含所有attrs属性第三C类都AB和特定属性添加到这样每个子类?

class C: 
    attrs = [...] 

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

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

回答

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") 

使用正确的继承关系(如第1例所示),也将有助于你的IDE中推出(如果您正在使用一个)环类型,因为IDE可以确定它期望的对象类型。可以甚至用这样类型的信息增强的功能:

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

A冒号之后是一个暗示该函数期望类型或A亚型的目的的IDE。

+0

因此,根据你我应该使用我暴露在我的问题中的第二个解决方案?但是,我的问题的第一点在技术上可行吗? 我不明白你为什么要添加一个C类,而且我也不明白你的最后一句话,对不起。 – vmonteco