python:classmethod和staticmethod的區別和使用場景

引入

初學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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章