先說函式的裝飾器,如下:
1view codedefzhuang(func):
2print("
**********===")
3return func #
高階函式45
6 @zhuang #
相當於是test = zhuang(test)
7def
test():
8print("
----------------")
910 test()
其實所有的@語法糖,都可以像**中注釋的那樣等於;類的裝飾器與函式裝飾器差不多。
1view codedefzhuang(obj):
2 obj.x = 1
3 obj.y = "
age"
4return
obj5
67 @zhuang #
相當於lei = zhuang(lei)
8class
lei:
9pass
1011
print(lei.__dict__) #
這樣寫死了,裝飾器不管你要不要都給你兩個資料屬性
上面這樣寫,顯得一點不靈活,在這基礎上改進,如下:
1view codedef 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__)
有了類的裝飾器有什麼用?
比如,可以像下面那樣與描述符一起用。
1view code#描述符判斷被描述的物件輸入的型別是不是想要的型別
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)
函式裝飾器 類裝飾器
一 函式裝飾函式 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.不帶引數裝飾器 此方式...