首頁 > 軟體

Python 類方法和靜態方法之間的區別

2022-07-08 18:05:35

前言

類中不僅可以有 methods,還可以有變數,這些變數稱為類屬性,例如如下程式碼中 Book 類的 TYPES 即為類屬性。

類中的方法分為3類:

1. 實體方法 instance method

不使用裝飾器
類中的所有方法,如果第一個引數是 self,就是 instance method, self 是建立的類範例,實體方法與範例即物件相關。
(self 可以改成別的名稱,但使用 self 是convention,self 是類範例, ),

2. 類方法 class method

使用 @classmethod 裝飾
類方法的第一個引數總是 cls。如果方法需要類的資訊,用 @classmethod 對其進行裝飾, 類方法經常被用作 factory,例如如下程式碼中的 hardcover 和 paperback 兩個 class method 方法就是可用於建立物件的 factory。
(cls 可以改成別的名稱,但使用 cls 是convention)

3. 靜態方法 static method

使用 @staticmethod 裝飾

靜態方法並不是真正意義上的類方法,它只是一個被放到類裡的函數而已。
儘管如此,仍然稱之為方法,但它沒有關於 class 或 object 的任何資訊,所以它實際上是一個獨立的函數,只是被放到了類裡,靜態方法既沒有 self 也沒有 cls 引數 。(靜態方法可以存取類屬性,例如 Book.TYPES)

靜態方法通常用於組織程式碼,例如如果認為將某個函數放到某個類裡,整體程式碼會因此更符合邏輯,於是可以將這個函數變成該類的靜態方法。所以如果需要在類裡放一個函數進去,此函數不會用到任何關於類或範例的資訊,那麼就可以用 @staticmethod 對其進行裝飾。

三種方法中,實體方法和類方法用得最多,靜態方法不常用。

class Book:
    TYPES = ("hardcover", "paperback")  # 精裝,平裝
    def __init__(self, name, book_type, weight):
        self.name = name
        self.book_type = book_type
        self.weight = weight
    def __repr__(self):
        return f"<Book {self.name}, {self.book_type}, weighing {self.weight}g>"
    def instance_method(self):
        print(f"Called instance method of {self}")
    @classmethod
    def class_method(cls):
        print(f"called class method of {cls}")
    @classmethod
    def hardcover(cls, name, paper_weight):  # cls 名稱任意,使用 cls 是 convention
        # 下一行的cls,改成 Book,程式碼也能跑,但應該寫成 cls, 以避免在 inheritance 可能會遇到的問題
        return cls(name, cls.TYPES[0], paper_weight + 100)  # 
    @classmethod
    def paperback(cls, name, paper_weight):
        # 下一行的cls,改成 Book,程式碼也能跑,但應該寫成 cls, 以避免在 inheritance 可能會遇到的問題
        return cls(name, cls.TYPES[1], paper_weight)
    @staticmethod
    def static_method():
        print("Called static method")
book = Book("Dive into Python", Book.TYPES[1], 800)
# Called instance method of <Book Dive into Python, paperback, weighing 800g>
book.instance_method()  
# 下一行程式碼和上一行完全等價
# Called instance method of <Book Dive into Python, paperback, weighing 800g>
Book.instance_method(book) 
# called class method of <class '__main__.Book'>
Book.class_method()
# Called static method
Book.static_method()
h_book = Book.hardcover("Harry Potter", 1500)
light = Book.paperback("Python 101", 600)
# <Book Harry Potter, hardcover, weighing 1600g>
print(h_book)
# <Book Python 101, paperback, weighing 600g>
print(light)

到此這篇關於Python 類方法和靜態方法之間的區別的文章就介紹到這了,更多相關Python類方法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com