python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法
Python3 @classmethod 函數裝飾器 聲明一個類方法
@classmethod函數裝飾器的主要作用是將一個類的普通方法(需要實例化使用)聲明為一個類方法(可以直接使用類名調用)。在類的功能擴展(包括功能的整合以及類的繼承),代碼整潔度,后期的可維護性起到一定的幫助。雖然類方法也可以在實例化后,使用實例化對象進行調用,但這是不贊成的,因為這樣會容易將它和普通的實例化方法混淆,后期代碼不利于維護。具體是否使用以及其是方法方式還需要根據業務的實際需要決定。
它是Python的內置函數,在python文件中直接可以使用。它只能被應用在類(class)中。
語法
class main:
@classmethod
def run(cls, arg1, arg2, ...):
...
參數
cls(必須) - 當前類本身
arg1,arg2 - 自定義參數
實例
§ 實例1 - @classmethod的使用方法
代碼及運行結果:
#先聲明類
class main:
#普通方法
def set(self, x):
print(x)
#類方法
@classmethod
def run(cls, n):
print(n)
#普通方法需要實例化后才能調用
o = main()
o.set('abc')
#輸出
abc
#類方法可以直接使用,不需要實例化
main.run(123)
#輸出
123
§ 實例2 - @classmethod的使用場景之代碼整合
有時我們可能會遇到一些情況,在創建類的時候只有一種可能性,但是在實際業務發展過程中將演變出多種可能性,這時需要在外部處理好參數,然后再實例化類,將參數傳遞給類。如果多個模塊調用這個類,必然會產生一定的混亂。如果將這個處理過程以一個普通方法的方式編寫在類中,又必須先實例化類,然后才能調用,但是這樣會導致先觸發類的初始化方法__init__()以及__repr__()、__set__()等等。可是我們的類是需要先把參數處理好,然后才能初始化,否則會出問題的,這可能導致整個類的業務邏輯方式改變。造成大量的修改。
代碼及運行結果:
#創建一個類
class Date(object):
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def print_date(self):
print(self.year, self.month, self.day)
#實例化類
data_object = Date('2018','10','31')
#執行輸出函數
data_object.print_date()
2018 10 31
#在上面的例子中可以看到類的實例化需要傳遞‘年月日’三個參數。并且是要求分別傳遞。那么假設用戶不按照要求填寫,他填寫的2018-10-31這樣的一個參數呢?
#我們需要先對參數進行分割處理,然后再實例化類。例如下面的代碼:
#分割函數
def from_string(date_as_string):
return map(int, date_as_string.split('-'))
#創建類
class Date(object):
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def print_date(self):
print(self.year, self.month, self.day)
#先執行分割函數對數據進行處理
year, month, day = from_string('2018-10-31')
#實例化類
data_object = Date(year, month, day)
#執行輸出函數
data_object.print_date()
2018 10 31
#這樣做視乎可以解決這個問題,但是from_string方法應該是屬于類的一部分,現在需要寫在外部,就導致了類功能外散,后期不便于管理,以后增加功能的時候會出現問題,所以我們就必須將from_string遷移到類里面去,并且還要在類的實例化之前調用它,我們都知道,一般情況下,如果想調用類中的方法,必須先實例化類,而我們現在的需求是要在實例化之前。這時就需要使用@classmethod咯。代碼如下:
#創建一個類
class Date(object):
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def print_date(self):
print(self.year, self.month, self.day)
#聲明類方法
@classmethod
def from_string(cls, date_as_string):
year, month, day = map(int, date_as_string.split('-'))
return cls(year, month, day) #實例化類并返回實例化對象
data_object = Date.from_string('2018-10-31')
#執行輸出函數
data_object.print_date()
2018 10 31
#這是一個比較經典的案例,來自于stackoverflow。我暫時沒有想到更好的,就先對原案例進行了一些修改并且加上了一些注釋。
#使用@classmethod可以有效的防止類功能外散,可以將對屬于當前類的功能集中起來,便于管理,并且對類的繼承、重載、多態都是有一定的幫助,這個小例子只能算是一個用法說明,在實際的操作中會有更加復雜的用法,還需要以項目的實際業務邏輯來制定。
§ 實例3 - @classmethod使用場景之類的重載
代碼及運行結果:
#聲明一個類
class main:
#聲明類方法
@classmethod
def run(cls):
#調用name方法
cls.name()
#聲明name類方法
@classmethod
def name(cls):
print('我是main類的name方法')
#聲明子類并繼承main類
class main2(main):
#重載基類的name方法
@classmethod
def name(cls):
print('我是main2類的name方法')
main2.run()
#我是main2類的name方法
#輸出結果是子類的重載name方法。因為cls指向的永遠都是調用那個類。
總結
以上是生活随笔為你收集整理的python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 修改计算机名_静心学数据分
- 下一篇: 奥奇传说森罗灵王阿瑞斯和奇迹王元皇哪个厉