Python 装饰器

装饰器 Decorator

通常用来装饰函数,给被装饰函数增加或改变一点功能,而不需要更改被装饰函数的代码及功能

装饰器本身也是一种函数,需要先定义再使用。

特点是以@开头的字符串

装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑

 

#e.g在原来的函数里加上一些文字

#定义装饰器endsign
def endsign(func):  #func就是被装饰的函数对象,在本案例中为hello
    def wrapper():    #定义装饰器后,第一步执行该函数
        return func() + '!!'   #第二步,去找func()函数,就是hello, 第四步拿到hello的返回值后,加上!!,再返回给wrapper
    return wrapper             #第五步,返回重新装饰过的函数

@endsign
def hello():       #第三步,被重新定义的函数,返回值给wrapper
    return 'hello'

print(hello())

 首先至少要有2个对象,装饰函数和被装饰函数,定义好装饰函数和需要装饰函数后,使用@装饰函数 在需要装饰函数的前面

执行调用的时候,就执行装饰函数

在本案里,@装饰函数相当于

def endsign(func):  
    def wrapper():   
        return func() + '!!'
    return wrapper
def hello():
     return 'hello'

newhello = endsign(hello)
print(newhello())

 

被装饰器的函数有参数

def endsign(func):
    def wrapper(*args, **kwargs):
        print('newarg1:', args)
        print('newarg2:', kwargs)
        return func(*args,**kwargs) + '!!'
    return wrapper

@endsign
def hello(arg1, arg2=''):  
    print('arg1:',arg1)
    print('arg2:',arg2)
    return 'Hi, they are %s and %s' % (arg1,arg2)

print(hello('cat',arg2='dog'))

 

装饰器函数本身有参数

def endsign(tail):        #tail 用来接收endsign里的参数
    def innerOne(func):   #只多了一层innerOne函数
        def wrapper():
            return '你好,' + func() + '' + tail
        return wrapper
    return innerOne

@endsign('!!??')
def hello():
    return 'hello'

print(hello())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值