1. 程式人生 > >python -類方法@classmethod和靜態方法@staticmethod

python -類方法@classmethod和靜態方法@staticmethod

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))


在這裡插入圖片描述