函式裝飾器與類的裝飾器

2022-09-06 21:09:19 字數 2876 閱讀 7920

先說函式的裝飾器,如下:

1

defzhuang(func):

2print("

**********===")

3return func #

高階函式45

6 @zhuang #

相當於是test = zhuang(test)

7def

test():

8print("

----------------")

910 test()

view code

其實所有的@語法糖,都可以像**中注釋的那樣等於;類的裝飾器與函式裝飾器差不多。

1

defzhuang(obj):

2 obj.x = 1

3 obj.y = "

age"

4return

obj5

67 @zhuang #

相當於lei = zhuang(lei)

8class

lei:

9pass

1011

print(lei.__dict__) #

這樣寫死了,裝飾器不管你要不要都給你兩個資料屬性

view code

上面這樣寫,顯得一點不靈活,在這基礎上改進,如下:

1

def typed(**kwargs):

2def

zhuang(obj):3#

print("*****====>", kwargs) # 這裡的kwargs是可以傳進來的4#

print('***************==',obj)

5for key,value in

kwargs.items():6#

obj.__dict__[key] = value # 下面那個與它意思一樣,但是不知道為什麼不行

7setattr(obj,key,value)

8return

obj910#

print("--------------", kwargs)

11return zhuang #

不能加括號

1213

14 @typed(name = '

wan') #

這裡函式名字加()就是執行得返回值,所以第一步:typed(x=1,y=2)----->zhuang 等價於 @zhuang

15class

lei:

16pass

1718

19print(lei.__dict__)

view code

有了類的裝飾器有什麼用?

比如,可以像下面那樣與描述符一起用。

1

#描述符判斷被描述的物件輸入的型別是不是想要的型別

2class

miaoshufu:

3def

__init__

(self, key, expected_type):

4 self.key =key

5 self.type =expected_type67

def__set__

(self, instance, value):

8if type(value) is

self.type:

9 instance.__dict__[self.key] =value

10else:11

print("

%s傳入的型別錯誤,應該是%s

" %(value, self.type))

1213

def__get__

(self, instance, owner):

14return instance.__dict__

[self.key]

1516

def__delete__

(self, instance):

17 instance.__dict__

.pop(self.key)

181920#

裝飾器21

def typed(**kwargs):

22def

zhuang(obj):

23for key,val in

kwargs.items():

24setattr(obj, key, miaoshufu(key,val))25#

key = miaoshufu(str(key), val)

26return

obj27

return

zhuang

2829

30 @typed(name = str,age = int) #

不然要寫很多,這樣減少了重複**

31class

people:32#

name = miaoshufu('name', str)33#

age = miaoshufu('age', int)

3435

def__init__

(self, name, age, salary, height):

36 self.name =name

37 self.age =age

38 self.salary =salary

39 self.height =height

4041 p = people("

wad", "

awa", 10000, 173)

view code

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...