zoukankan      html  css  js  c++  java
  • 装饰器在类中的实现

    装饰器原理

    定义:   装饰器用于装饰某个函数,可以让函数在执行前或执行后执行某些操作

    @outer:   1、执行outer函数,并将其下面的函数名赋值给outer的参数

           2、将outer的返回值重新赋值给f1

    def outer(func):
        def inner():
            print("222")
            print("222")
            r=func()
            print("3333")
            print("3333")
            return r
        return inner
    @outer
    def f():
        print("000")
    r=f()
    #1、遇到outer函数放到内存
    #2、遇到@outer 执行outer函数,把@outer下面的函数名当做参数执行outer函数,
    #3、把outer的返回值inner重新赋值给f
    #4、现在执行f()就相当于执行inner
    #5、执行inner,先print("222")
    #6、再执行func  ,这里的func是原来的函数f()既print("000")
    #7、再执行print("333")
    #8、返回一个原来函数的返回值r给inner就是现在的f
    

    装饰器的参数传递

    讲装饰器在类中的实现首先就是应该弄明白的就是装饰器的参数传递,在上面的例子的装饰器里面是没有参数的,但是在实际运用的过程中参数是必不可少的,由上面的例子我们知道装饰器相当于把函数从新定义的结果,让原函数执行装饰器中的函数伪造出一种结果,所以原函数的参数必须和装饰器内层函数的参数个数一致。由于装饰器用于装饰不同的函数,所以参数是不一定的,但是我们可以用一个‘万能’的参数来代替。

    def outer(func):
        def inner(*args,**kwargs):
            print("222")
            print("222")
            r=func(*args,**kwargs)
            print("3333")
            print("3333")
            return r
        return inner
    @outer
    def f(a1,a2):
        print("000")
    r=f(1,2)        #这里传的参数必须和f函数的参数个数一致

    到此我们就不难理解装饰器应用于函数中了

    一、装饰器在类中

    class A(object):
        def outer(func):
            def inner(self):
                print("222")
                r=func(self)
                print("3333")
                return r
            return inner
        @outer
        def f(self):
            print("000")
    obj = A()
    obj.f()

    二、装饰器不在类中

    def outer(func):
        def inner(self):
            print("222")
            r=func(self)
            print("3333")
            return r
        return inner
    class  S(object):
        @outer
        def f(self):
            print("000")
    a = S()
    a.f()
    
  • 相关阅读:
    zoj 2110
    zoj 2376 Ants
    zoj 2256 Mincost
    企业版app在iOS8上无法安装的几个问题解决
    源码推荐(8.05):一行代码实现多风格的推送小红点,效果很好的跑马灯
    iOS在支持arc的工程中,导入不支持arc的第三方的插件
    一个异步加载图片的公用类: EGOImageLoading
    一款轻量级的 iOS 图像缓存
    UIGestureRecognizer学习笔记
    IOS两个App应用之间的跳转
  • 原文地址:https://www.cnblogs.com/luxiaojun/p/6994175.html
Copyright © 2011-2022 走看看