2016-08-12 78 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