python装饰器

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) 就是一个类的实例

你可能感兴趣的:(python装饰器)