類的裝飾器

2022-09-11 14:39:21 字數 1891 閱讀 8814

#

類的裝飾器

#對不同的類使用裝飾器加上不同的類屬性

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...