2016-08-12 10 views
0

私は、次のしている場合:サブクラスで特定の属性の継承を防止しますか?

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

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

AクラスからA_attrを継承し、私のBサブクラスを防止する方法はありますか?

またはこの悪いデザインとみなされるであろうと、私はより良い、すべてのattrsの属性を含む第3の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を拡張します。あなたがCと同様Bのインスタンスを提供することができますCommon型のオブジェクトを好きな場所、これができるようになりますどのような

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

です。また、クラスAのインスタンスが必要な場合は、Cのインスタンスを提供できます。 サブクラスごとに特定のインスタンスを追加すると、それを行うことはできません。

コメント

からだからに従って、私は私の質問に露出した第2のソリューションを使用する必要があります。

いいえ

各サブクラスで属性を追加する代わりに、別のクラスに属性を追加し、新しいクラスにこの中間クラスを継承させることをおすすめします。したがって、それらのサブクラスのそれぞれに特定の属性を追加する必要はありません。

上記の例は既に提供されています。あなたの提案とは対照的に、これを行う利点は何かを見てみましょう。

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

関連する問題