ホームページ >バックエンド開発 >Python チュートリアル >Python の __repr__ などの特別なメソッドではインスタンスのオーバーライドが機能しないのはなぜですか?
特別なメソッドのインスタンス オーバーライドを理解する
以下のコードを考えてみましょう。
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A() a
驚くべきことに、 repr(a)意図した結果「A」が得られません。これはなぜですか?この動作を修正できますか?
Python では、通常、特別なメソッド (名前が「__」で囲まれたメソッド) はインスタンスではなくクラスで呼び出されます。これは、標準インタープリタである CPython の実装の詳細です。したがって、インスタンスで __repr__() をオーバーライドして、それが機能することを期待する直接的な方法はありません。
しかし、間接的な解決策はあります。
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
次に、 __repr__() をオーバーライドします。 ) たとえば、これを _repr():
setattr(a, "__repr__", MethodType(_repr, a, a.__class__))
に置き換えるだけです。このアプローチは、次の理由により効果的であることが証明されています。 _repr() は、クラス レベルで実装された元の __repr__() メソッドを呼び出します。
対照的に、特別ではないメソッドをオーバーライドしようとする次の例を考えてみましょう。
class A(object): def foo(self): return "foo" def bar(self): return "bar" a = A() setattr(a, "foo", MethodType(bar, a, a.__class__))
この場合、foo() は特別なメソッドではないため、インスタンス上で直接呼び出されるため、オーバーライドは期待どおりに機能します。
以上がPython の __repr__ などの特別なメソッドではインスタンスのオーバーライドが機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。