我們知道,在不改變原有**的基礎上,我們可以使用裝飾器為函式新增新的功能。同理,一切皆物件,我們也可以使用裝飾器為類新增類屬性。what?
defdeco(obj):
obj.x = 1obj.y = 2
return
obj@deco
#foo = deco(foo)
class
foo:
pass
print(foo.__dict__)
上述的**為foo屬性字典新增了x和y屬性,但如果想新增'name' = 'harden'呢,這需要更靈活的定義了。so
def deco(**kwargs):def
for k, v in
kwargs.items():
setattr(obj, k, v)
return
obj
return
@deco(x=1, y=2)
class
foo:
pass
print(foo.__dict__)
我們再定義類bar,
@deco(name='curry')
class
bar:
pass
name屬性也可以新增進去
再來個公升級版,利用資料描述符和類的裝飾器為類屬性限定資料型別
我們知道,在不改變原有**的基礎上,我們可以使用裝飾器為函式新增新的功能。同理,一切皆物件,我們也可以使用裝飾器為類新增類屬性。what?defdeco(obj):
obj.x = 1obj.y = 2
return
obj@deco
#foo = deco(foo)
class
foo:
pass
print(foo.__dict__
)上述的**為foo屬性字典新增了x和y屬性,但如果想新增
'name
' = '
harden
'呢,這需要更靈活的定義了。so
def deco(**kwargs):
def
for k, v in
kwargs.items():
setattr(obj, k, v)
return
obj
return
@deco(x=1, y=2)
class
foo:
pass
print(foo.__dict__
)我們再定義類bar,
@deco(name='
curry')
class
bar:
pass
name屬性也可以新增進去
再來個公升級版,利用資料描述符和類的裝飾器為類屬性限定資料型別
#資料描述符,**另乙個新式類的屬性
class
typedef:
def__init__
(self, key, expected_type):
self.key =key
self.expected_type =expected_type
def__get__
(self, instance, owner):
#print('exec __get__')
#print(instance)
#print(owner)
return instance.__dict__
[self.key]
def__set__
(self, instance, value):
#print('exec __set__')
ifnot
isinstance(value, self.expected_type):
raise
typeerror
instance.
__dict__[self.key] =value
def__delete__
(self, instance):
instance.
__dict__
.pop(self.key)
def deco(**kwargs):
def
for k, v in
kwargs.items():
#為obj新增屬性 如 name = tpyedef('name', str)
setattr(obj, k, typedef(k, v))
return
obj
return
@deco(name=str, age=int, salary=float) #
class
people:
def__init__
(self, name, age, salary):
self.name =name
self.age =age
self.salary =salary
p1 = people('
handen
', 18, 111.11)
(p1.name)
print(p1.__dict__)
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.不帶引數裝飾器 此方式...
python 類裝飾器
defouter x definner 函式巢狀 returnx 跨域訪問,引用了外部變數x returninner 函式作為返回值 closure outer 外部變數 函式作為變數賦給closure print closure 執行閉包 實際上,類也可以作為裝飾器。類裝飾器主要依賴於函式 cal...