python -類方法@classmethod和靜態方法@staticmethod
阿新 • • 發佈:2019-01-03
Python中至少有三種比較常見的方法型別,即例項方法,類方法、靜態方法。它們是如何定義的呢?
如何呼叫的呢?它們又有何區別和作用呢?
首先,這三種方法都定義在類中。
例項方法
定義:第一個引數必須是例項物件,該引數名一般約定為“self”,通過它來傳遞例項的屬性和方法(也可以傳類的屬性和方法);
呼叫:只能由例項物件呼叫。
類方法
定義:使用裝飾器@classmethod。第一個引數必須是當前類物件,該引數名一般約定為“cls”,
通過它來傳遞類的屬性和方法(不能傳例項的屬性和方法);
呼叫:例項物件和類物件都可以呼叫。
靜態方法
定義:使用裝飾器@staticmethod。引數隨意,沒有“self”和“cls”引數,但是方法體中不能使用類或例項的任何屬性和方法;
呼叫:例項物件和類物件都可以呼叫。
#原始碼:
@classmethod
def today(cls):
“Construct a date from time.time().”
t = _time.time()
return cls.fromtimestamp(t)
@classmethod
def fromordinal(cls, n):
y, m, d = _ord2ymd(n)
return cls(y, m, d)
ctrl點選檢視datetime原始碼
class Date(object): def __init__(self, year, month, day): self.__year = year self.__month = month self.__day = day # 例項方法,第一個引數必須是例項物件,該引數名一般約定為“self”,只能由例項物件呼叫。 def echo(self): print("%s %s %s" % (self.__year, self.__month, self.__day)) # 預設情況下, 需要將所有相關日期的操作封裝到Date類中; # 如果不做任何改變, s實質上時例項化的物件本身, 不是我們想要的字串; @classmethod # 類方法,第一個引數必須是當前類物件,該引數名一般約定為“cls”。例項物件和類物件都可以呼叫。 def as_string(cls, s): # "2019-10-10" cls為Date類本身,通過它來傳遞類的屬性和方法 year, month, day = s.split('-') return cls(year, month, day) # cls實質上就是Date @staticmethod #靜態方法,沒有“self”和“cls”引數,但是方法體中不能使用類或例項的任何屬性和方法。例項物件和類物件都可以呼叫。 def is_valid(s): year, month, day = map(int, s.split('-')) return year > 0 and 0 < month <= 12 and 1 <= day <= 31 if __name__ == "__main__": # 例項化日期類 d = Date(2019, 10, 2) d.echo() # @classmethod類方法 s = "2019-10-10" Date.as_string(s).echo() # @staticmethod靜態方法 print(Date.is_valid(s))