python装饰器学习笔记一
合理地使用装饰器,能够减少代码冗余,使代码的可读性更高,结构更加清晰,还能实现一些神奇的功能。
例1:实现函数运行前后打印信息
"""装饰器————日志打印"""
# 定义装饰器
def logger(func):
def wrapper(*args, **kwargs):
print("start: {}".format(func.__name__))
func(*args, **kwargs)
print("end")
return wrapper
@logger
def add(n,m):
print(n+m)
return n+m
add(3,4)
运行结果:
start: add
7
end
例2:实现函数运行时间计时:
"""装饰器————时间计时器"""
import time
def timer(func):
def wrapper(*args, **kwargs):
time_start = time.time()
print("开始时间:{}".format(time_start))
func(*args, **kwargs)
time_end = time.time()
print("结束时间:{}".format(time_end))
cost_time = time_end - time_start
print("cost time: {}".format(cost_time))
return wrapper
@timer
def sleep_func(time_):
print("开始睡着")
time.sleep(time_)
print("睡醒了")
sleep_func(3)
运行结果:
开始时间:1589000558.8140652
开始睡着
睡醒了
结束时间:1589000561.8142624
cost time: 3.000197172164917
例3:装饰器传递参数,适用于实现大致功能一致,部分不同的装饰器
"""传参数的装饰器————嵌套"""
def say_hello(contry):
def wrapper(func):
def deco(*args, **kwargs):
if contry == "china":
print("你好!")
elif contry == "america":
print("hello!")
else:
return
func(*args, **kwargs)
return deco
return wrapper
@say_hello("china")
def chinese():
print("我来自中国。")
@say_hello("america")
def american():
print("I am from America")
chinese()
american()
运行结果:
你好!
我来自中国。
hello!
I am from America
例4:不带参数的 类 装饰器
class logger2(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("[INFO]: the function {func} is running"
.format(func=self.func.__name__))
return self.func(*args, **kwargs)
@logger2
def say(something):
print("say {}!".format(something))
say("hello")
运行结果:
[INFO]: the function say is running
say hello!
例5:带参数的 类 装饰器
"""带参数的!类装饰器!"""
class logger3(object):
def __init__(self, msg, level="INFO"):
self.msg = msg
self.level = level
def __call__(self, func):
def wrapper(*args,**kwargs):
print("[{level}]: The function \"{name}\" {msg}"
.format(level=self.level, msg=self.msg, name=func.__name__))
func(*args, **kwargs)
return wrapper
@logger3(msg="is running", level="INFO")
def say(something):
print("say {}!".format(something))
say("hello~")
运行结果:
[INFO]: The function "say" is running
say hello~!
例6:自带的property装饰器,实现自定义类属性的封装调用
"""自带的property装饰器"""
class Student(object):
def __init__(self, name):
self.name = name
self._age = None
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise ValueError("输入不合法:年龄必须为整数!")
if not 0<value<100:
raise ValueError("输入不合法:年龄范围在0-100之间")
self._age=value
print("赋值完成")
@age.deleter
def age(self):
del self._age
print("删除成功")
xh = Student("小红")
xh.age = 18
print(xh.age)
del xh.age
运行结果:
赋值完成
18
删除成功