首頁 >後端開發 >Python教學 >Python 中的「@staticmethod」和「@classmethod」有什麼不同?

Python 中的「@staticmethod」和「@classmethod」有什麼不同?

Barbara Streisand
Barbara Streisand原創
2024-12-17 01:08:25713瀏覽

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

理解Python 中@staticmethod 和@classmethod 裝飾器的區別

Python 中的@staticmethod 和@classmethod 裝飾器@classmethod具有不同行為的等級方法。以下是它們主要差異的詳細說明:

呼叫約定:

  • @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作為第一個隱式傳遞argument:

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>, 1)

使用類別方法時,隱式傳遞實例的類別而不是。 >@staticmethod

裝飾器創建的方法的行為類似於常規函數,沒有任何隱式類別或實例綁定。
a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)

@classmethod
a.static_foo(1)
# executing static_foo(1)
裝飾器建立綁定到類別本身的方法,允許它們修改類別屬性或建立替代建構子。

以上是Python 中的「@staticmethod」和「@classmethod」有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn