ホームページ >バックエンド開発 >Python チュートリアル >Python の __repr__ などの特別なメソッドではインスタンスのオーバーライドが機能しないのはなぜですか?

Python の __repr__ などの特別なメソッドではインスタンスのオーバーライドが機能しないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-06 17:01:11701ブラウズ

Why Doesn't Instance Overriding Work for Special Methods Like `__repr__` in Python?

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

以下のコードを考えてみましょう。

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

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