更好的辦法是在類中轉儲通用功能。
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。
因此,根據你我應該使用我暴露在我的問題中的第二個解決方案?但是,我的問題的第一點在技術上可行嗎? 我不明白你爲什麼要添加一個C類,而且我也不明白你的最後一句話,對不起。 – vmonteco