类的装饰器
一、与函数的装饰器一样,类也可以被装饰
def deco(func):
print('=============>')
return func
@deco #test = deco(test)
def test():
print('test函数')
test()

在装饰器给类设置属性
def deco(obj):
print('=============>')
obj.x = 1
obj.y = 2
obj.z = 3
return obj
@deco #test = deco(test)
def test():
print('test函数')
print(test.__dict__)
上述代码在装饰器函数中把属性写死了,如果不同的类需要设置不同的属性呢
def deco(**kwargs):
def wrapper(obj):
for key,val in kwargs.items():
setattr(obj,key,val)
return obj
return wrapper
@deco(x = 1,y = 2, z = 3) #1.deco(x= 1,y= 2,z=3) --->wrapper 2.Foo = wrapper(Foo)
class Foo:
pass
print(Foo.__dict__)
@deco(name= 'jinling')
class Bar:
pass
print(Bar.name)
print(Bar.__dict__)

与前面描述符应用结合,类的装饰器的应用
class Typed:
def __init__(self,key,excp_typed):
self.key = key
self.excp_typed = excp_typed
def __get__(self, instance, owner):
print('正在执行get方法')
return instance.__dict__[self.key]
def __set__(self, instance, value):
print('正在执行set方法')
if not isinstance(value,self.excp_typed):
raise TypeError("你传入的参数类型不是",self.excp_typed)
instance.__dict__[self.key] = value
def __delete__(self, instance):
print("正在执行delete方法")
instance.__dict__.pop(self.key)
def deco(**kwargs): #kwargs = {'name';str,'age':int}
def wrapper(obj): #obj = People
for key, val in kwargs.items(): #(('name',str),('age',int))
print("=====>")
setattr(obj, key,Typed(key,val)) #People.name = Type('name',str)
return obj
return wrapper
@deco(name = str, age = int) #@wrapper ==>People = wrapper(People)
class People:
def __init__(self,name,age,salary):
self.name = name
self.age = age
self.salary = salary
p1 = People('jinling',19,13000)
print(p1.__dict__)
一个奋斗中的产品小白

浙公网安备 33010602011771号