1.装饰器之类装饰器
顾名思义,这个其中就是将类当做装饰器,话不多说,上代码
class Test1:
def __call__(self, *args, **kwargs):
self.fun(*args, **kwargs)
print(2222)
def __init__(self, fun):
print(1111)
self.fun = fun
@Test1
def index(a):
print("召唤师,欢迎来到王者峡谷", a)
index(333)
1.1输出结果
1111
召唤师,欢迎来到王者峡谷 333
2222
Process finished with exit code 0
1.2思路总结:
思路:1.将类作为装饰器,对于一个普通方法应该是这样
此时 index是一个对象,作为一个对象想被调用,那么类中必须要有call方法,于是先写个call方法
这时 又有一个新问题,Test(index)给类传个参数了。那么就要有一个,带参数的init方法
这时又出现一个新问题,call方法是写装饰器内容的,其中也要调用传进来的方法,那么这时需要用到
init方法进行数据初始化,将数据存起来
@Test 其实 这个就相当于 index = Test1(index)
def index():
print(xxxx)
2.装饰器之普通装饰器
def putong(fun):
def func(*args, **kwargs):
print("装饰器中在被装饰方法前做的事情")
fun(*args, **kwargs)
print("装饰器中在被装饰方法前做的事情")
return func
@putong
def index(a):
print("召唤师,欢迎来到王者峡谷", a)
index(333)
2.1 结果
装饰器中在被装饰方法前做的事情
召唤师,欢迎来到王者峡谷 333
装饰器中在被装饰方法后做的事情
3.装饰器之既可以装饰函数又可以装饰类
def putong(fun):
def func(*args, **kwargs):
print("装饰器中在被装饰方法前做的事情")
return fun(*args, **kwargs)
return func
@putong # putong = putong(Test2)
class Test2:
name = '王二狗'
def __init__(self, age):
self.age = age
t = Test2(18)
print(t)
print(t.name)
3.1 输出结果
装饰器中在被装饰方法前做的事情
<__main__.Test2 object at 0x0000025E64339160>
王二狗
3.2 总结
“ putong = putong(Test2) ” 且 “t = Test2(18)” 意味着,装饰器中内层装饰器必须要返回一个Test2类对象 ,
因此“return fun(*args, **kwargs)”中 fun代表Test2类名,fun(*args, **kwargs),相当于
Test2(18) 就是一个类的实例