この記事では主に、動的に変更されるPythonクラスのインスタンスメソッドに関する関連情報を紹介しますので、必要な方は参考にしてください
動的に変更されるPythonクラスのインスタンスメソッド
プログラムをプログラミングする際に、それを変更したいと思う人も多いと思います。動作コードが作成されており、最も一般的な方法は、サブクラスを使用して、ニーズを満たさない親クラスのメソッドをオーバーライドすることです。たとえば、次の例を考えてみましょう。
class Dog: def bark(self): print 'Woof!' class Husky(Dog): def bark(self) print 'Howl!'
上記の方法を使用して自分で作成したコードを変更できますが、サードパーティのコードはどのように変更すればよいでしょうか?もちろん、自分でサブクラスを作成し、サブクラスのインスタンス オブジェクトを呼び出して変更を実装することもできますが、これにより他の一連の問題が発生する可能性があります。したがって、元のオブジェクトのメソッドを独自のメソッドに置き換える方法を見つける必要があります。これが、この記事で次に紹介する「パッチ」メソッドです。
クラスにパッチを適用する
オブジェクトのメソッドを追加または変更したい場合、最も簡単な方法はクラスにパッチを適用することです。上記の例と組み合わせると、独自の Dog クラスに新しいハウル メソッドを作成したい場合は、次のコードのように、新しいハウル関数を定義してクラスに追加できます。しかし、注意が必要な問題がいくつかあります。まず、変更されたクラスのすべてのインスタンスのメソッドが更新されるため、更新されたメソッドは新しく作成されたオブジェクトに存在するだけでなく、上書きされずに追加された場合を除き、以前に作成されたすべてのオブジェクトにも更新されたメソッドが含まれます。オリジナルのメソッド。次に、変更または追加するメソッドはオブジェクトにバインドする必要があるため、メソッドの最初のパラメータは呼び出されるオブジェクト (この場合はクラス インスタンス self) である必要があります。
クラス インスタンスのパッチ適用このクラスの他のインスタンスに影響を与えることなく、個々のオブジェクトにパッチを適用することもできます。しかし、まだいくつかのトリックがあります!まず次の例を見てみましょう。
def newbark(self): print 'Wrooof!' def howl(self): print 'Howl!' # Replace an existing method Dog.bark = newbark # Add a new method Dog.howl = howl
次に、新しく定義したメソッドを呼び出してみましょう:
def herd(self, sheep): self.run() self.bark() self.run() border_collie = Dog() border_collie.herd = herd
エラーが発生しました!エラーの理由は、呼び出されたオブジェクトが、作成した関数の最初のパラメーターとして渡されていないことです。もちろん、パラメータを自分で渡すこともできますが、クラス メソッドを置き換えるこのシナリオでは機能しません。この問題の正しい解決策は、type モジュールで MethodType 関数を使用することです。次のサンプル コードを見てみましょう:
border_collie.herd(sheep) TypeError: herd() takes exactly 2 arguments (1 given) The problem with the previous code is that the herd is not a bound method, just take a look at the following code: print border_collie.herd <function herd at 0xf9c5f0>
これでメソッドがインスタンスにバインドされ、完了です。
概要たとえば、単体テストでは、テストを容易にするために、外部サービスとの通信を担当する一部の関数を置き換える必要があります。この手法は非常に一般的であるだけでなく、最終的にコードを変更する前にコードを保守しやすい状態に保つための非常に重要な手法でもあります。
以上がPythonクラスの動的変更のサンプルコードを解析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。