ホームページ >バックエンド開発 >Python チュートリアル >インスタンスの `__repr__` を Python でオーバーライドできないのはなぜですか?また、それを効果的に実現するにはどうすればよいですか?
以下のコード スニペットを考えてみましょう:
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A() print(a) # <__main__.A object at 0x00AC6990> print(repr(a)) # '<__main__.A object at 0x00AC6990>' setattr(a, "__repr__", MethodType(__repr__, a, a.__class__)) print(a) # <__main__.A object at 0x00AC6990> print(repr(a)) # '<__main__.A object at 0x00AC6990>'
ご覧のとおり、カスタム __repr__ メソッドは呼び出されません。インスタンス a.この動作を理解するには、次の点に注意することが重要です。
CPython (標準の Python インタプリタ) では、名前が __ で囲まれた特別なメソッドは通常、インスタンスではなくクラスで呼び出されます。その結果、インスタンス上で __repr__ を直接オーバーライドしようとしても、予期した結果は得られません。
この制限を回避するには、次の戦略を利用できます:
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
ここでは、 __repr__ヘルパー メソッド _repr を呼び出し、その後、オブジェクト クラスのデフォルトの __repr__ 実装を呼び出します。 _repr をオーバーライドすることで、インスタンスの __repr__ を効果的にオーバーライドできます。
以上がインスタンスの `__repr__` を Python でオーバーライドできないのはなぜですか?また、それを効果的に実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。