ホームページ > バックエンド開発 > Python チュートリアル > Python の「@staticmethod」と「@classmethod」の違いは何ですか?

Python の「@staticmethod」と「@classmethod」の違いは何ですか?

Barbara Streisand
リリース: 2024-12-17 01:08:25
オリジナル
709 人が閲覧しました

What's the Difference Between `@staticmethod` and `@classmethod` in Python?

Python の @staticmethod デコレータと @classmethod デコレータの違いを理解する

Python の @staticmethod デコレータと @classmethod デコレータを使用すると、クラスを作成できます異なる動作を持つ -level メソッド。主な違いの詳細な説明は次のとおりです。

呼び出し規約:

  • @staticmethod: 静的メソッドは特定のメソッドにバインドされません。インスタンスまたはクラス。これらは、インスタンスとクラスの両方から直接呼び出すことができる通常の関数のように動作します。
  • @classmethod: クラス メソッドは、特定のインスタンスではなく、クラス自体にバインドされます。これらは通常、属性の変更や代替コンストラクターの作成など、クラス自体に対する操作を実行するために使用されます。

メソッド シグネチャ:

  • 静的メソッドクラスまたはインスタンスを暗黙的な最初の引数として受け取りません。
  • クラス メソッドは、クラスを最初の暗黙的な引数として受け取ります。引数。
  • インスタンス メソッド (デコレータのないメソッド) は、最初の暗黙的な引数としてインスタンスを受け取ります。

インスタンス化:

  • 静的メソッドは、クラスのインスタンスを作成せずに呼び出すことができます。
  • クラス メソッドは次のとおりです。インスタンスとクラスの両方から呼び出されます。
  • インスタンス メソッドは、クラスのインスタンスからのみ呼び出すことができます。

実際の例:

を検討してください次のコード スニペット:

class A(object):
    def foo(self, x):
        print("executing foo({self}, {x})")

    @classmethod
    def class_foo(cls, x):
        print("executing class_foo({cls}, {x})")

    @staticmethod
    def static_foo(x):
        print("executing static_foo({x})")

a = A()
ログイン後にコピー

foo を呼び出すと、インスタンス a は暗黙的に最初の引数として渡されます:

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>, 1)
ログイン後にコピー

クラス メソッドでは、インスタンスのクラスが自分自身ではなく暗黙的に渡されます:

a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
ログイン後にコピー

静的メソッドは暗黙的に何も受け取りません引数:

a.static_foo(1)
# executing static_foo(1)
ログイン後にコピー

概要:

  • @staticmethod デコレーターは、暗黙的なクラスや関数を使用せずに、通常の関数のように動作するメソッドを作成します。インスタンス バインディング。
  • @classmethodデコレータは、クラス自体にバインドされたメソッドを作成し、クラス属性を変更したり、代替コンストラクタを作成したりできるようにします。

以上がPython の「@staticmethod」と「@classmethod」の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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