装饰器在类中的实现

装饰器原理

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

@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()

 

转载于:https://www.cnblogs.com/luxiaojun/p/6994175.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值