日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python3 @classmethod 函數(shù)裝飾器 聲明一個類方法

@classmethod函數(shù)裝飾器的主要作用是將一個類的普通方法(需要實例化使用)聲明為一個類方法(可以直接使用類名調(diào)用)。在類的功能擴展(包括功能的整合以及類的繼承),代碼整潔度,后期的可維護性起到一定的幫助。雖然類方法也可以在實例化后,使用實例化對象進行調(diào)用,但這是不贊成的,因為這樣會容易將它和普通的實例化方法混淆,后期代碼不利于維護。具體是否使用以及其是方法方式還需要根據(jù)業(yè)務(wù)的實際需要決定。

它是Python的內(nèi)置函數(shù),在python文件中直接可以使用。它只能被應(yīng)用在類(class)中。

語法

class main:

@classmethod

def run(cls, arg1, arg2, ...):

...

參數(shù)

cls(必須) - 當(dāng)前類本身

arg1,arg2 - 自定義參數(shù)

實例

§ 實例1 - @classmethod的使用方法

代碼及運行結(jié)果:

#先聲明類

class main:

#普通方法

def set(self, x):

print(x)

#類方法

@classmethod

def run(cls, n):

print(n)

#普通方法需要實例化后才能調(diào)用

o = main()

o.set('abc')

#輸出

abc

#類方法可以直接使用,不需要實例化

main.run(123)

#輸出

123

§ 實例2 - @classmethod的使用場景之代碼整合

有時我們可能會遇到一些情況,在創(chuàng)建類的時候只有一種可能性,但是在實際業(yè)務(wù)發(fā)展過程中將演變出多種可能性,這時需要在外部處理好參數(shù),然后再實例化類,將參數(shù)傳遞給類。如果多個模塊調(diào)用這個類,必然會產(chǎn)生一定的混亂。如果將這個處理過程以一個普通方法的方式編寫在類中,又必須先實例化類,然后才能調(diào)用,但是這樣會導(dǎo)致先觸發(fā)類的初始化方法__init__()以及__repr__()、__set__()等等。可是我們的類是需要先把參數(shù)處理好,然后才能初始化,否則會出問題的,這可能導(dǎo)致整個類的業(yè)務(wù)邏輯方式改變。造成大量的修改。

代碼及運行結(jié)果:

#創(chuàng)建一個類

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

#執(zhí)行輸出函數(shù)

data_object.print_date()

2018 10 31

#在上面的例子中可以看到類的實例化需要傳遞‘年月日’三個參數(shù)。并且是要求分別傳遞。那么假設(shè)用戶不按照要求填寫,他填寫的2018-10-31這樣的一個參數(shù)呢?

#我們需要先對參數(shù)進行分割處理,然后再實例化類。例如下面的代碼:

#分割函數(shù)

def from_string(date_as_string):

return map(int, date_as_string.split('-'))

#創(chuàng)建類

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)

#先執(zhí)行分割函數(shù)對數(shù)據(jù)進行處理

year, month, day = from_string('2018-10-31')

#實例化類

data_object = Date(year, month, day)

#執(zhí)行輸出函數(shù)

data_object.print_date()

2018 10 31

#這樣做視乎可以解決這個問題,但是from_string方法應(yīng)該是屬于類的一部分,現(xiàn)在需要寫在外部,就導(dǎo)致了類功能外散,后期不便于管理,以后增加功能的時候會出現(xiàn)問題,所以我們就必須將from_string遷移到類里面去,并且還要在類的實例化之前調(diào)用它,我們都知道,一般情況下,如果想調(diào)用類中的方法,必須先實例化類,而我們現(xiàn)在的需求是要在實例化之前。這時就需要使用@classmethod咯。代碼如下:

#創(chuàng)建一個類

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

#執(zhí)行輸出函數(shù)

data_object.print_date()

2018 10 31

#這是一個比較經(jīng)典的案例,來自于stackoverflow。我暫時沒有想到更好的,就先對原案例進行了一些修改并且加上了一些注釋。

#使用@classmethod可以有效的防止類功能外散,可以將對屬于當(dāng)前類的功能集中起來,便于管理,并且對類的繼承、重載、多態(tài)都是有一定的幫助,這個小例子只能算是一個用法說明,在實際的操作中會有更加復(fù)雜的用法,還需要以項目的實際業(yè)務(wù)邏輯來制定。

§ 實例3 - @classmethod使用場景之類的重載

代碼及運行結(jié)果:

#聲明一個類

class main:

#聲明類方法

@classmethod

def run(cls):

#調(diào)用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方法

#輸出結(jié)果是子類的重載name方法。因為cls指向的永遠都是調(diào)用那個類。

總結(jié)

以上是生活随笔為你收集整理的python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。