飛酷告訴你@classmethod類方法的作用原來那么大
2024-06-12 加入收藏
大家好,我是小K,今天由我來為大家講解類方法和類方法的使用場景。
什么是類方法?
要說什么是類方法,就肯定要先說下什么是類,什么是方法。(廢話)
類
用來描述具有相同的屬性和方法的對象的集合。
它定義了該集合中每個對象所共有的屬性和方法。
對象是類的實例。
方法
類中定義的函數。
這里方法是指所有定義在類里面的方法,包含實例方法、靜態方法、類方法。
但我們今天所說的類方法并不是類+方法,而是類里面方法的一種。
類方法
修飾器@classmethod
來標識其為類方法,第一個參數必須要默認傳類,一般習慣用cls
(表示類本身)。
類方法是只與類本身有關而與實例無關的方法。
通過cls
引用的必定是類對象的屬性和方法,不能訪問實例屬性,能夠通過實例對象和類對象去訪問類方法。
代碼示例:
class MyClass:
counter = 0 # 類屬性
@classmethod
def increment(cls):
cls.counter += 1
# 調用類方法
MyClass.increment()
print(MyClass.counter) # 輸出 1
上述代碼中我們不需要實例化MyClass
就可執行類中的increment
函數,還可以拿到/修改類屬性的值。
所以這對于管理類級別的狀態是非常有用的。
類方法的用處
1. 工廠方法
類方法可以用作工廠函數,創建類的實例并返回。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def create_person(cls, name, birth_year):
age = datetime.now().year - birth_year
return cls(name, age)
# 使用類方法創建實例
person = Person.create_person("John", 1990)
用當前年份減去出生年份來計算年齡(age),然后使用這些信息創建并返回一個新的Person類實例。
2. 提供備用構造函數
類方法允許提供不同的構造方式,以滿足不同的需求。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
@classmethod
def from_tuple(cls, point_tuple):
return cls(*point_tuple)
# 使用類方法創建實例
point = Point.from_tuple((3, 4))
3. 多線程鎖
在多線程環境中,類方法可以與鎖一起使用,確保對共享資源的訪問是線程安全的,防止競爭條件和數據不一致
import threading
class Counter:
count = 0
lock = threading.Lock()
@classmethod
def increment(cls):
with cls.lock:
cls.count += 1
# 在多線程環境中安全地增加計數
def worker():
for _ in range(100000):
Counter.increment()
# 創建多個線程來執行工作
threads = [threading.Thread(target=worker) for _ in range(5)]
# 啟動線程
for thread in threads:
thread.start()
# 等待所有線程完成
for thread in threads:
thread.join()
# 輸出最終的計數值
print(Counter.count)
只有用類方法拿到鎖,才允許進行
count += 1
的操作。
最后
相比實例方法,類方法是一個很容易被忽略的知識點,很多入門書里并不會以此為重點去講解它的用途和特點。
但在一些處理與整個類相關的任務,使用類方法還是一個非常明智的選擇。