#類的裝飾器
#對不同的類使用裝飾器加上不同的類屬性
def typed(**kwargs):
defdeco(obj):
for k, v in
kwargs.items():
setattr(obj, k, v)
return
obj
return
deco
@typed(x=1, y=2, z=3) #
1、typed(x=1, y=2, z=3)->deco 2、@deco->foo=deco(foo)
class
foo:
pass
print(foo.__dict__
)@typed(name='
alex')
class
bar:
pass
print(bar.__dict__)#
通過類的裝飾器再對描述符檢測資料型別的例子進行改寫
class typed: #
定義描述符的類,必須是乙個資料描述符
def__init__(self, key, expected_type): #
定義乙個例項化方法,主要用於傳例項字典的key,和期望的資料型別
self.key =key
self.expected_type =expected_type
def__get__
(self, instance, owner):
#instance 代表例項(p1) owener代表例項的擁有者(people)
return instance.__dict__[self.key] #
返回例項字典key的值
def__set__
(self, instance, value):
#instance 代表例項(p1) value代表傳入的值
ifnot isinstance(value, self.expected_type): #
判斷使用者傳入的name如果不是字串
print('
你傳入的型別不是%s
' %self.expected_type)
return
#return終止此方法,不執行下面的賦值
instance.__dict__[self.key] =value
def classtyped(**kwargs): #
kwargs=
def deco(obj): #
obj=people
for k, v in kwargs.items(): #
(('name', str), ('age', int), ('salary', float))
setattr(obj, k, typed(k, v)) #
setattr(people, 'name', typed('name', str))
return
obj
return
deco
@classtyped(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('
alex
', 18, 2584.25)
print(p1.__dict__) #
p1.name = '
egon
'print(p1.__dict__) #
函式裝飾器 類裝飾器
一 函式裝飾函式 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 二...
類的裝飾器
def deco obj obj.x 1 obj.y 2 return obj deco 相當於foo deco foo class foo pass print foo.dict deco 相當於test deco test def test pass print test.dict 輸出 def...
類的裝飾器
類的裝飾器 def deco func print return func deco test deco test def test print test函式執行 test deco foo deco foo class foo pass defdeco obj print obj obj.x 1o...