Python装饰器
装饰器作用
- 装饰器可也用来扩展函数或者类的功能,在不改变原有主体函数或类的情况下,简便的为其扩展功能。
- 因为装饰器内功能调用在主体前,所以可以拦截主体函数调用或拦截主体类创建实例,并且处理它们。
函数装饰器
一个简单的装饰器,没有任何意义,仅是展示装饰器的用法。
def my_decorator(func):
def wrapper():
print("warpper")
return func()
print("my_decorator")
return wrapper
@my_decorator
def show():
print("show")
show()
print("函数名:%s" % show.__name__)
输出:
my_decorator
warpper
show
函数名:wrapper
这其中有一个问题,show()
函数的名字已经改变,因为在装饰器中返回的是包装过的wrapper(*args, **kwargs)
函数。如果要解决这个问题,可以引入官方包import functools
,代码如下:
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper():
print("warpper")
return func()
print("my_decorator")
return wrapper
@my_decorator
def show():
print("show")
show()
print("函数名:%s" % show.__name__)
输出:
my_decorator
warpper
show
函数名:show
可以看到函数名已经回复正常。一般装饰器的使用都会是对原有函数进行功能扩充,所以原函数有参的话也可以传入装饰器。两个整数加法,如不是整数提示错误。
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for i in range(len(args)):
if not isinstance(args[i], int):
print("输入错误,请输入整数")
return
return func(*args, **kwargs)
return wrapper
@my_decorator
def add(x, y):
print("加法结果:%d" % (x + y))
add(11, 22)
类装饰器
可以为一个类添加装饰器,不改变类原有代码的情况下,为类添加或修改属性,也可以为类增加函数。
import functools
def my_decorator(cls):
def show():
print("新加入函数")
@functools.wraps(cls)
def wrapper():
cls.name = "张三"
cls.age = 20
cls.show = show
return cls
return wrapper
@my_decorator
class A:
def __init__(self):
self.name = "小明"
print("init")
a = A()
print(a.age)
print(a.name)
a.show()
输出:
20
张三
新加入函数
类A
的def __init__(self)
并没有执行,已经被装饰器拦截。装饰器为A
添加了属性和函数。
初学python,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。