1.
import time, datetime
class Ly:
def __init__(self, fun):
self.fun = fun
print('this is the first step on ' + str(datetime.datetime.now()))
time.sleep(1)
self.fun()
def __call__(self):
print('this is the thirty step on ' + str(datetime.datetime.now()))
time.sleep(1)
@Ly
def show():
print('this is the second step on ' + str(datetime.datetime.now()))
time.sleep(1)
if __name__ == "__main__":
show()
print('this is the fourth step on ' + str(datetime.datetime.now()))
2.
import time
class Ly(object):
def __init__(self, fun):
print("this is the first step")
time.sleep(1)
self.fun = fun
def __call__(self, *args):
print("this is the second step")
time.sleep(1)
self.fun(*args)
print("this is the fourth step")
time.sleep(1)
@Ly
def show(a1, a2, a3, a4):
print('this is the thirty step', a1, a2, a3, a4)
time.sleep(1)
show("parm", "1", "1", "1")
print("After first part call")
time.sleep(1)
show("parm", "2", "2", "2")
print("After second part call")
从中可以发现:
(1).只要有被类装饰器装饰的对象,类装饰器的 __init__ 函数就会执行(不需要调用)
(2).被类装饰器装饰的函数不论被调用几次,__init__ 函数只会执行一次,并且它的执行是被装饰函数声明装饰时就自动执行,不需要手动调用
(3).当被装饰函数存在参数时,从 __call__ 函数传进参数(不必须 *args,但这是一种规范 def __call__(self,*args,**kwargs))
*args是指字符串,**kwargs是指字典
3.
import time
class Ly:
def __init__(self, one_parm, two_parm, three_parm):
self.one_parm = one_parm
self.two_parm = two_parm
self.three_parm = three_parm
def __call__(self, fun):
print('性别为' + self.one_parm + "的" + self.two_parm + "岁的" + self.three_parm)
time.sleep(1)
def info(*args):
fun(*args)
return info
@Ly("男", "22", "ly")
def show(name, age, sex):
print('性别为' + sex + "的" + age + "岁的" + name)
show("蓝月", "20", "男")
注意:
(1).装饰器有装饰器的参数,函数(被装饰器修饰的函数)有函数的参数,不可混淆
(2).的参数从 __init__ 函数中传,函数的参数从 __call__ 函数中传