无参的装饰函数
1.先定义一个函数,这个函数作为我们的包装函数,用来装饰别人
def filter():
print(filter)
2.定义一个我们的业务函数,用包装函数来装饰一下,并执行
def filter(func):
print("filter")
return func
@filter
def work():
print("work")
work()
@相当于表达式:work = filter(work)
执行work函数,相当于执行了
work = filter(work)
work()
执行结果
filter
work
有参的装饰函数
work的入参a,b通过*args, **kwargs传入。work函数通过func传入,也是通过入参传入。
所以内部定义了两个函数
def ter(abc="default"):
def fafunc(func):
def fargfunc(*args, **kwargs):
func(*args, **kwargs)
return fargfunc
return fafunc
@ter("abc")
def work(a,b):
print "work",a,b
work("a",1)
执行结果:
work a 1
类的装饰
类的装饰和函数类似
def a
@a
def class b
b()相当于b() = a(b())
b.func相当于b.func = a.func(b)
def filt(w):
class color:
def __init__(self, age):
self.color = 'black'
self.wrapped = w(age)
def display(self):
print("color is", self.color)
self.wrapped.display()
return color
@filt
class dog:
def __init__(self, age):
self.age = age
def display(self):
print("dog age is", self.age)
a = dog(4)
a.display()
执行结果:
('color is', 'black')
('dog age is', 4)