ホームページ > バックエンド開発 > Python チュートリアル > Python インスタンスで特別なメソッドを直接オーバーライドできないのはなぜですか?

Python インスタンスで特別なメソッドを直接オーバーライドできないのはなぜですか?

Patricia Arquette
リリース: 2024-11-28 22:14:11
オリジナル
804 人が閲覧しました

Why Can't I Override Special Methods Directly on Python Instances?

インスタンスの特別なメソッドのオーバーライド: 探索

クラスのインスタンスがあり、そのインスタンスを変更したい状況を想像してください。 __repr__() などの特別なメソッド。これらのメソッドをオーバーライドしようとすると、予期しない動作が発生する可能性があります。

これを説明するには、次のコードを考えてみましょう。

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()
ログイン後にコピー

repr(a) を呼び出すと、「A」を取得することが期待されます。 」、repr がオーバーライドされていると仮定します。ただし、結果は予想どおりではありません。

この矛盾は、特別なメソッドを呼び出す Python のアプローチに起因します。通常、Python はクラス自体に対してのみ特別なメソッドを実行し、そのインスタンスに対しては実行しません。したがって、repr をインスタンスに直接上書きすることは効果がありません。

この制限を克服するには、次のアプローチを検討してください。

class A(object):
    def __repr__(self):
        return self._repr()
    def _repr(self):
        return object.__repr__(self)
ログイン後にコピー

この変更されたコードでは、インスタンスの 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 インスタンスで特別なメソッドを直接オーバーライドできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート