これは「モンキーパッチ」と呼ばれ、場合によっては完全に合理的です。
たとえば、 に依存する他の誰かのコード (変更できない) を使用するSuperClass
必要があり、そのコードの動作を変更する必要がある場合、唯一の現実的な選択肢は のメソッドを置き換えることSuperClass
です。
ただし、あなたの場合、これを行う正当な理由はないようです。のすべてのサブクラスを定義しているSuperClass
ので、その間に別のクラスを追加してみませんか?
class Intermediate(SuperClass):
def func3():
pass
class SubClass1(Intermediate):
def func1():
print 'hi'
SuperClass
これは、制御できない他のコードがその機能を必要とする場合、「含まれているはずなのに含まれていなかった機能」には十分ではありません。より簡単です。
サブクラスでさえあなたの管理下にない場合、多くの場合、それぞれのクラスから新しいクラスを派生させることができます. 例えば:
class Func3Mixin(object):
def func3():
pass
class F3SubClass1(SubClass1, Func3Mixin):
pass
class F3SubClass2(SubClass2, Func3Mixin):
pass
F3SubClass1
の代わりに のインスタンスを作成するだけですSubClass1
。SubClass1
インスタンスを期待していたコードは、問題なく使用できますF3SubClass1
。そして、Python のダック タイピングは、この種の「ミックスイン指向プログラミング」を特に単純にします。 の実装内では、のFunc3Mixin.func3
属性とメソッドを使用できます。であるランタイム オブジェクトも になります。SuperClass
Func3Mixin
SuperClass
Func3Mixin
SuperClass
一方、モンキーパッチが適切な場合でも、それが必ずしも最善の答えとは限りません。たとえば、サードパーティ コードのバグを回避するためにパッチを適用している場合、そのコードには優れたライセンスと、独自のパッチを簡単に維持できるソース リポジトリがあり、それをフォークして修正済みコピーを作成できます。 、元の代わりにそれを使用します。
また、記述したとおりに実際に使用できるクラスはないことも指摘しておく価値があります。メソッドを呼び出そうとすると、引数TypeError
が欠落しているため、エラーが発生します。self
しかし、あなたが にモンキーパッチを当てた方法ではfunc3
、 とまったく同じように失敗しfunc1
ます。(そして、上でスケッチした代替案についても同じことが言えます。)
最後に、ここにあるすべてのクラスは new-style ではなくクラシック クラスSuperClass
ですobject
。もちろん、 を変更できない場合、それはあなたのせいではありませんが、サブクラス (または ) をおよびから多重継承SuperClass
させることで、とにかく修正したい場合があります。(注意を払っている場合: はい、これは新しいスタイルのクラスを混在させることができることを意味します。ただし、その理由を理解するには、内部ではメタクラスを理解する必要があります。)Intermediate
object
SuperClass