より良いアイデアは、共通の機能をクラスにダンプすることです。
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へのヒントであること。
あなたによれば、私は私の質問で明らかに第二の解決策を使用する必要がありますか?しかし、私の質問の第一のポイントは技術的に可能ですか? Cクラスを追加する理由は分かりませんでしたが、最後の文も理解できませんでした。 – vmonteco