ホームページ >バックエンド開発 >Python チュートリアル >インスタンスの `__repr__` を Python でオーバーライドできないのはなぜですか?また、それを効果的に実現するにはどうすればよいですか?

インスタンスの `__repr__` を Python でオーバーライドできないのはなぜですか?また、それを効果的に実現するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-28 12:30:11675ブラウズ

Why Doesn't Overriding `__repr__` on an Instance Work in Python, and How Can It Be Effectively Achieved?

インスタンスの特別なメソッドをオーバーライドする

以下のコード スニペットを考えてみましょう:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。