python装饰器的理解

首先理解python的函数

def base():
    print('i am base')

print(type(base), base) 
#<class 'function'> <function base at 0x03934150>

print(type(base()),base())
#i am base
#i am base
#<class 'NoneType'> None

python的函数名可以理解为指向一个内存单元的指针,而函数名()则为调用这个函数

def test():
    return base()

def base():
    print('i am base')
    return "end"

print(test())
#1.调用test()
#2.返回base()的调用,执行base
#3.返回字符串“end"
def deco(func):
    def wrapper():
        print('我是装饰器')
        return func()#这也是为什么内层要返回被装饰函数的调用
    return wrapper

@deco
def test():
    print("我是测试函数")

test()
#我是装饰器
#我是测试函数

装饰器的目的是在不改变原来函数的基础上增加的新的功能
假如现在我有多个测试函数,我想再测试它们的时候,给每一个函数标记一个顺序,这样方便查看

@deco
def test():             #标记1
     #....执行事情
@deco
def test2():            #标记2
     #....执行事情
@deco
def test3():            #标记3
    #.....执行事情

很明显的是,我们在目前的装饰器内部,是无法知道每一个函数的序号,这意味着我们要把序号手动传进去

再次强调 装饰器不修改原函数

@deco
def test3(id = 3):#毫无疑问是错的,他改变了函数,而且id现在作为被装饰函数的参数,我们也无法调用它
    #.....执行事情

因此,我们需要给装饰器本身传进去

然后我考虑给装饰器本身多加一个参数

def deco(func,num):#这里多了一个num,用来传进去序号
     #打印num
    def wrapper():
        print('我是装饰器')
        return func()
    return wrapper
@deco
def test():
    print("我是测试函数")
   #不过这样不能执行。。。。。。我暂时不知道怎么解决

接下来是正统方法

def param(num):
    def deco(func):
        def wrapper():
            print("当前序号",num)
            print('我是装饰器')
            return func()
        return wrapper
    return deco

@param('id1')
def test():
    print("我是测试函数")

test()
#当前序号 id1
#我是装饰器
#我是测试函数

接下来就明白了! 所谓的 @name 就是函数名字,下面的函数就是它的参数!,它参数分为两种
1.@name() 即后面带括号,那么它的参数就是括号里面的东西
2.@name 不带括号 它的参数 就是下面的被装饰函数,且只有一个

def param(num,newfunc):
    def deco(func):
        def wrapper():
            newfunc()
            print("当前序号",num)
            print('我是装饰器')
            return func()
        return wrapper
    return deco

def other2():
    print('我是other函数')

@param(3,other2) #传入了两个参数 一个num 和 函数
def test():
    print("我是测试函数")

test()
#我是other函数
#当前序号 3
#我是装饰器
#我是测试函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值