当前位置 博文首页 > m0_51723227的博客:装饰器

    m0_51723227的博客:装饰器

    作者:[db:作者] 时间:2021-08-09 10:03

    装饰器

    装饰器的本质是闭包

    作用是不需要改变 原代码 便可以给它增加另外的功能

    比如一个函数是这样的:

    def f1():
        print("=====正在登陆无异常=====")
    

    我们想在 **print()**的上面和下面分别添加

    =====正在验证...=====

    =====验证成功...=====

    并且不能修改函数f1的代码,我们可以利用闭包:

    def f1():
        print("=====正在登陆无异常=====")
    
    
    def func(function):
        def func1():
            print("=====正在验证...=====")
            function()
            print("=====验证成功...=====")
    
        return func1
    
    
    func(f1)()
    '''
    有人可能不理解func(f1)()是怎么回事
    其实可以这样理解
    a = func(f1)
    a()
    '''
    

    结果:

    =====正在验证...=====
    =====正在登陆无异常=====
    =====验证成功...=====
    

    现在我们使用装饰器,即 @闭包

    def func(function):
        def func1():
            print("=====正在验证...=====")
            function()
            print("=====验证成功...=====")
        return func1
    
    
    @func
    def f1():
        print("=====正在登陆无异常=====")
        
    
    
    f1()  #调用 f1() 其实就是相当于  调用func(),而把 f1 当成func()的形参穿进去了
    

    结果:

    =====正在验证...=====
    =====正在登陆无异常=====
    =====验证成功...=====
    

    以上的装饰器为自定义装饰器

    在python里面还有一些内置装饰器

    • @classmethod

    让方法变成类方法

    • @staticmethod

    让方法变成静态方法

    • @property

    可以实现访问实例方法时使用实例.属性形式

    class Func:
    
        instance = 0
    
        def __init__(self, name):
            self.name = name
            Func.instance += 1
    #类方法
        @classmethod
        def func1(cls):
            return cls.instance
    #静态方法
        @staticmethod
        def func2():
            return "今天是个好日子"
    #属性形式访问
        @property
        def func3(self):
            return "大家好,我叫 %s" % self.name
    
    
    xiao_ming = Func("小明")
    xiao_hong = Func("小红")
    xiao_hei = Func("小黑")
    a = Func("sss")
    print(Func.func1())
    print(a.func2())
    print(xiao_hei.func3)    #仔细看访问形式
    
    

    以及类装饰器

    class Myclass:
        def __init__ (self,func):
            self.func = func
    
        def __call__ (self, *args, **kwargs):
            print("--------------正在验证---------------")
            return self.func()
    # 这里有个注意点,就是类装饰里面必须有 __call__方法!!!!!!!!!!!!!!
    
    @Myclass
    def f1():
        print("------------正在登陆------------")
    
    f1()
    '''
    这里解释一下类装饰器的运行原理
    第一步,当 @某一个类时,便自动实例化一个对象了,并且把f1传入--init--中,即func是f1放入形参
    举个例子
    就是在@类的时候,就已经发生了   a = Myclass( f1 )
    但是并没有写出这一步,便直接把 f1 这个函数体给穿进去了
    
    
    '''
    
    

    结果:

    --------------正在验证---------------
    ------------正在登陆------------
    
    cs
    下一篇:没有了