# 装饰器一共有这四种情况
# 1、无参单装饰器
# 2、原函数传参 装饰器不传
# 3、装饰器传参 原函数不传
# 4、装饰器原函数同时传参
# -----------------------------------------无参单装饰器------------------------------------------------
def decorate(x):
def case1():
print("在原函数之前增加的新功能")
x()
print("在原函数之后增加的新功能")
return case1
@decorate
def function():
print("原函数")
# --------------------------------------原函数传参 装饰器不传-------------------------------------------
def decorate1(func):
def wrapper(x,y):
print("传入的参数值:",end="")
print(x)
print("传入的第二个参数值:", end="")
print(y)
func(x,y)
return wrapper
@decorate1
def function1(x,y):
print("原函数")
# --------------------------------------装饰器传参 原函数不传-------------------------------------------
def decorate2(s):
def case1(func):
def case2():
print("装饰器的参数:",s)
func()
return case2
return case1
@decorate2(2)
def function2():
print("原函数")
# --------------------------------------装饰器原函数同时传参--------------------------------------------
def decorate3(x):
def case1(func):
def case2(y):
print("装饰器参数:",x)
print("函数参数:",y)
func(y)
return case2
return case1
@decorate3("zhuang")
def function3(x):
print("原函数")
if __name__ == '__main__':
# function()
# function1(1,2)
# function2()
function3("han")
当使用装饰器传参时,就需要外加一层函数
可以做一下最后一道面试题:记录一下踩过的坑,少写括号,导致无法兼容装饰器不带参数
上面为方法的装饰器,接下来介绍类装饰器
先简单理解cls和self的区别:简单的说self是类(Class)实例化的对象。cls 是类(或子类)本身
因为装饰器修饰类时,传参就是cls类本身了
拿单例模式举例
```python
def singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@singleton
class Initializer:
def __init__(self):
self.scheduler = BackgroundScheduler()