から詳細をお読みください目的もありますが、これを行う必要はまれです。クラスを定義した後でクラスにパッチを適用する必要があると思うなら、それが本当に最善の方法であるかどうかを常に止めて検討する必要があります。
1つの状況は、猿のパッチです。私は大規模なPloneシステムでこれをやったことがありますが、いくつかのメソッドには微妙な調整が必要でしたが、正常に動作をオーバーライドする簡単な方法はありませんでした。複雑なライブラリがある状況では、元のライブラリを変更することなく、新しい動作や変更された動作を簡単に挿入できます。
その他の状況では、自動的に生成できるメソッドがたくさんある場合があります。例えばデータ駆動テスト。
def createTest(testcase, somedata, index):
def test(self):
"Do something with somedata and assert a result"
test_name = "test_%d" % index
setattr(testcase, test_name, test)
for index, somedata in enumerate(somebigtable):
createTest(MyTestCase, somedata, index)
MyTestCaseがたunittest.TestCaseのときにデータのすべてを通過するが、それが失敗したデータの行を把握しようとするために持っているよりも最初の失敗で停止し、あなたの一つのテストを持つことができます。メソッドを動的に作成することで、すべてのテストが別々に実行され、テスト名によってどの名前が失敗したかがわかります(上のコードの元は実際にはデータの一部とインデックスを含む意味のある名前を作成しました)。
定義が完了する前に、クラス自体またはその辞書を参照する方法がないため、クラス本体の内部ではその操作を行うことはできません。しかし、メタクラスと似たようなことをすることができます。それは、クラス自体を作成する前にクラスを修正することができます。また、同じことを行うよりきれいな方法です。
注意すべき点は、これが機能しない状況があることです。一部の__xxx__
特殊メソッドは、クラスの作成後にオーバーライドできません。元の定義はクラスの__dict__
以外の場所に保存されるため、後で変更する場合は無視される可能性があります。また、メタクラスで作業する場合、メタクラスがクラス定義の一部として属性に与える処理を追加機能で取得できないことがあります。
興味深い!これはまた、他の価値がクラスの中心ではないメソッドの定義を他の場所に移しているかもしれないことを示唆しています。明らかに特別な状況のために。 –