本文重點(diǎn):解決了類里面定義的裝飾器,在同一個(gè)類里面使用的問題,并實(shí)現(xiàn)了裝飾器的類屬性參數(shù)傳遞
10年的吳堡網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整吳堡建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“吳堡網(wǎng)站設(shè)計(jì)”,“吳堡網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。目錄:
一、基本裝飾器
二、在類里定義裝飾器,裝飾本類內(nèi)函數(shù)
三、類裝飾器
正文:
一、基本裝飾器
裝飾不帶參數(shù)的函數(shù)
def clothes(func): def wear(): print('Buy clothes!{}'.format(func.__name__)) return func() return wear @clothes def body(): print('The body feels could!') #備注:@是語(yǔ)法糖 # 不用語(yǔ)法糖的情況下,使用下面語(yǔ)句也能實(shí)現(xiàn)裝飾作用:把body再加工,再傳給body # body = clothes(body) 裝飾帶一個(gè)參數(shù)的函數(shù)
裝飾帶不定長(zhǎng)參數(shù)的函數(shù)
通常裝飾器不只裝飾一個(gè)函數(shù),每個(gè)函數(shù)參數(shù)的個(gè)數(shù)也不相同
這個(gè)時(shí)候使用不定長(zhǎng)參數(shù)*args,**kwargs
def clothes(func): def wear(*args, **kwargs): print('Buy clothes!{}'.format(func.__name__)) return func(*args, **kwargs) return wear @clothes def body(part): print('The body feels could!{}'.format(part)) @clothes def head(head_wear, num=2): print('The head need buy {} {}!'.format(num, head_wear)) body('hands') head('headdress')裝飾器帶參數(shù)
# 把裝飾器再包裝,實(shí)現(xiàn)了seasons傳遞裝飾器參數(shù)。 def seasons(season_type): def clothes(func): def wear(*args, **kwargs): if season_type == 1: s = 'spring' elif season_type == 2: s = 'summer' elif season_type == 3: s = 'autumn' elif season_type == 4: s = 'winter' else: print('The args is error!') return func(*args, **kwargs) print('The season is {}!{}'.format(s, func.__name__)) return func(*args, **kwargs) return wear return clothes @seasons(2) def children(): print('i am children') children()二、在類里定義裝飾器,裝飾本類內(nèi)函數(shù):
類裝飾器,裝飾函數(shù)和類函數(shù)調(diào)用不同的類函數(shù)
把裝飾器寫在類里
在類里面定義個(gè)函數(shù),用來裝飾其它函數(shù),嚴(yán)格意義上說不屬于類裝飾器。
class Buy(object): def __init__(self, func): self.func = func # 在類里定義一個(gè)函數(shù) def clothes(func): # 這里不能用self,因?yàn)榻邮盏氖莃ody函數(shù) # 其它都和普通的函數(shù)裝飾器相同 def ware(*args, **kwargs): print('This is a decrator!') return func(*args, **kwargs) return ware @Buy.clothes def body(hh): print('The body feels could!{}'.format(hh)) body('hh')裝飾器裝飾同一個(gè)類里的函數(shù)
背景:想要通過裝飾器修改類里的self屬性值。
class Buy(object): def __init__(self): self.reset = True # 定義一個(gè)類屬性,稍后在裝飾器里更改 self.func = True # 在類里定義一個(gè)裝飾器 def clothes(func): # func接收body def ware(self, *args, **kwargs): # self,接收body里的self,也就是類實(shí)例 print('This is a decrator!') if self.reset == True: # 判斷類屬性 print('Reset is Ture, change Func..') self.func = False # 修改類屬性 else: print('reset is False.') return func(self, *args, **kwargs) return ware @clothes def body(self): print('The body feels could!') b = Buy() # 實(shí)例化類 b.body() # 運(yùn)行body print(b.func) # 查看更改后的self.func值,是False,說明修改完成三、類裝飾器
定義一個(gè)類裝飾器,裝飾函數(shù),默認(rèn)調(diào)用__call__方法
# class Decrator(object): def __init__(self, func): # 傳送的是test方法 self.func = func def __call__(self, *args, **kwargs): # 接受任意參數(shù) print('函數(shù)調(diào)用CALL') return self.func(*args, **kwargs) # 適應(yīng)test的任意參數(shù) @Decrator # 如果帶參數(shù),init中的func是此參數(shù)。 def test(hh): print('this is the test of the function !',hh) test('hh')定義一個(gè)類裝飾器,裝飾類中的函數(shù),默認(rèn)調(diào)用__get__方法
實(shí)際上把類方法變成屬性了,還記得類屬性裝飾器吧,@property
下面自已做一個(gè)property
class Decrator(object): def __init__(self, func): self.func = func def __get__(self, instance, owner): ''' instance:代表實(shí)例,sum中的self owner:代表類本身,Test類 ''' print('調(diào)用的是get函數(shù)') return self.func(instance) # instance就是Test類的self class Test(object): def __init__(self): self.result = 0 @Decrator def sum(self): print('There is the Func in the Class !') t = Test() print(t.sum) # 眾所周知,屬性是不加括號(hào)的,sum真的變成了屬性做一個(gè)求和屬性sum,統(tǒng)計(jì)所有輸入的數(shù)字的和
class Decrator(object): def __init__(self, func): self.func = func def __get__(self, instance, owner): print('調(diào)用的是get函數(shù)') return self.func(instance) class Test(object): def __init__(self, *args, **kwargs): self.value_list = [] if args: for i in args: if str(i).isdigit(): self.value_list.append(i) if kwargs: for v in kwargs.values(): if str(v).isdigit(): self.value_list.append(v) @Decrator def sum(self): result = 0 print(self.value_list) for i in self.value_list: result += i return result t = Test(1,2,3,4,5,6,7,8,i=9,ss=10,strings = 'lll') print(t.sum)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。