引入
初學python面向對象,對classmethod和staticmethod的區別和使用場景進行簡單總結。
注:兩者的使用場景並不完善,只是記錄自己用過的。
語法區別
聲明時:
- classmethod的第一個參數爲類本身(cls),正如實例方法的第一個參數爲對象本身(self);
- staticmethod第一個參數不需要傳入cls或self,故staticmethod中是無法訪問類和對象的數據的。
調用時:
- 都可用類名直接調用
- 也可用實例對象調用(不推薦,沒必要)
code如下:
class Test:
@classmethod
def f1(cls, info):
print(info)
@staticmethod
def f2(info):
print(info)
In [2]: Test.f1('hi')
hi
In [3]: Test.f2('hello')
hello
In [4]: t = Test()
In [5]: t.f1('hi')
hi
In [6]: t.f2('hello')
hello
In [7]:
使用場景
兩者特點:
- classmethod可以設置修改類屬性;也可以實例化對象;
- staticmethod無法訪問類或對象的數據,所以可把它當作一個輔助功能方法用,裏面包含一些與該類有關的邏輯代碼。比如validate(*args)
實例1
需求:從本地文件中(txt, csv, json等等)讀取數據,生成一個對象。比如,本地有一個data.json文件,裏面包含了每個學生的姓名及對應的考試成績。現在要求讀取該數據,生成一個class對象。
思路:
- __init__方法中,清晰的聲明對象的屬性
- 用一個classmethod:load_json,專門用於讀取data_file,獲取數據,實例化對象
- 用一個staticmethod:validate,來對要初始化數據進行有效性檢查
代碼:
class Class:
def __init__(self, names, grades):
self._names = names
self._grades = grades
@classmethod
def load_json(cls, data_file):
# 讀取數據,獲得names,grades
cls.validate(names,grades)
return cls(names, grades)
@staticmethod
def validate(names, grades):
# 檢查數據有效性
pass