日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法

發布時間:2023/11/27 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 函数装饰器 声明一个类方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。