普通函数装饰器
- 装饰器本身就是一个高价函数,要不参数为函数,要不返回值为函数
- 装饰器是在不入侵函数的基础之上,增强装饰函数的功能
- 在带参装饰器有时会用到闭包和柯里化的操作
普通函数装饰器案例
- #sumnum == wapper(sumnum) == _wapper
- #summum(x,y) == _wapper(x,y)
- #def summum(x,y) == def _wapper(x,y)
def wapper(fn):
def _wapper(*args):
print("This is good function")
func = fn(*args)
return func
return _wapper
@wapper
def sumnum(x,y):
return x+y
print(sumnum(3,5))
类属性装饰器概念混淆误操作
- # Person == wappeer(Person)===等价返回值_wapper,
- #因此此时相当于class _wapper:因为Person没有紧跟(),因此无法调用此函数
- #只有调用此函数后,才能返回cls,所以到此时,Person就是_wapper函数
def wapper(cls):
def _wapper():
"""dsds"""
cls.name = "tom"
return cls
return _wapper
@wapper
class Person:
AGE = 8
print(Person.__dict__)
print(type(Person))
运行结果:
{}
<class 'function'>
正确写法
- 装饰器函数不嵌套和嵌套都可以,如果带参则进行柯里化
- 装饰器返回值任然是类
def wapper(cls):
cls.name = "tom"
return cls
@wapper
class Person:
AGE = 8
print(Person.__dict__)
print(type(Person))
运行结果:
{'__module__': '__main__', 'AGE': 8, 'name': 'tom', '__doc__': None, '__dict__': <attribute '__dict__' of 'Person' objects>,
'__weakref__': <attribute '__weakref__' of 'Person' objects>}
<class 'type'>
带参装饰器分析
- 带参装饰器本身返回函数wapper(name) 本身等于 _wapper
- 相当于@_wapper
- 因此相当于将Person这个类作为_wapper(Person)的参数
def wapper(name):
def _wapper(cls):
cls.name = name
return cls
return _wapper
@wapper("tom") #等价于@_wapper
class Person:
AGE = 8
print(Person.__dict__)
print(type(Person))
运行结果:
{'__module__': '__main__', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Person' objects>,
'name': 'tom', 'AGE': 8, '__dict__': <attribute '__dict__' of 'Person' objects>}
<class 'type'>