1.入门装饰器
"""
入门装饰器
- 必须是函数嵌套
- 必须返回内部函数
"""
def logger(func):
def warpper(*args, **kwargs):
print('开始执行')
func(*args, **kwargs)
print("执行完毕")
return warpper
@logger
def add():
print(1+1)
add()
2. 带参数的装饰器
"""
带参数的装饰器
- 需要三层嵌套
- 最外层是要传入的参数
- 第二层是要传入的函数
- 第三层代表要处理的函数
"""
def hello(contry): # 参数
def wrapper(func): # 传入函数
def deco(*args, **kwargs): # 代表传入的函数
if contry == "中国":
print("中国你好")
elif contry == "美国":
print("美国你好")
else:
return
func(*args, **kwargs)
return deco
return wrapper
@ hello('中国')
def fun1():
print('我来自中国')
@ hello('美国')
def fun2():
print('我来自美国')
fun1()
print("-"*20)
fun2()
3. 类装饰器
"""
类装饰器
- 必须实现__init__方法,接受被装饰函数
- 必须实现__call__方法,实现装饰逻辑,必须返回函数
"""
class Logger(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print(self.func.__name__)
return self.func
@Logger
def sekk():
pass
sekk()
4. 带参数的类装饰器
"""
带参数的装饰器
- init 方法接收参数
- call 方法接收函数
- 并且在call方法中要嵌套函数并返回这个函数
"""
class Logger2(object):
def __init__(self, level="INFO"):
self.level = level
def __call__(self, func): # 接收函数
def wrapper(*args, **kwargs):
print(self.level)
func(*args, **kwargs) # 返货函数
return wrapper
@Logger2(level='WARNING')
def func3():
print("我是带参数的类装饰器")
func3()
5. 使用装饰器实现单例模式
instance_obj = {}
def singleton(cls):
def get_instance(*args, **kwargs):
class_name = cls.__name__
if class_name not in instance_obj:
instance = cls(*args, **kwargs)
instance_obj[class_name] = instance
return instance_obj[class_name]
return get_instance
@singleton
class Test1(object):
def __init__(self, name):
self.name = name
t1 = Test1('tom')
print(t1.name)
t2 = Test1('janni')
print(t2.name)
6. 带参数的类装饰器
class User(object):
def __init__(self):
pass
@property
def age(self):
return self.__dict__['age']
@age.setter
def age(self, value):
if not isinstance(value, int):
raise ValueError('输入不合法:年龄必须为数值!')
if not 0 < value < 100:
raise ValueError('输入不合法:年龄范围必须0-100')
self.__dict__['age'] = value
@age.deleter
def age(self):
del self.__dict__['age']
u = User()
# 赋值
u.age = 25
# 查看
print(u.age)
# 删除
del u.age