Python---装饰器

文章内容:

1.装饰器的意义,装饰器优势的体现
2.如何使用装饰器为函数增加一个功能,并且不会改变函数内部的实现
3.语法糖
4.被装饰函数有一个或者多个参数的情况,装饰器如何支持
5.被装饰函数含有关键字参数的情况,装饰器如何支持
6.装饰器最终的定义形式

"""
装饰器
开闭原则:对修改是封闭的,对扩展是开放的
用装饰器去解决问题
如果想为一个函数增加一个功能,比如时间,并且不想去改变函数内部的实现
装饰器的优势的体现
比如装饰器里面有很复杂的代码,不用装饰器,就需要加在每一个函数里面
"""
import time

def f1():
    print('Hello')

def f2():
    print('Hello')
print(time.time())
f1()
print(time.time())
f2()
"""
1535815321.3426168
Hello
1535815321.3426168
Hello
"""
def print_current_time(func):
    print(time.time())
    func()
print_current_time(f1)
print_current_time(f2)
"""
1535815336.2754712
Hello
1535815336.2754712
Hello
"""


#############################################装饰器模式
import time

def decortor(func):
    def wrapper():
        print(time.time())
        func()
    return wrapper

def f1():
    print('Hello')

f=decortor(f1)
f()
"""
1535815360.070832
Hello
"""


#################################python中装饰器的特点,意义所在,@符号,语法糖
"""
语法糖:
指计算机语言中添加的某种语法,这种语法对语言的功能并没有什么影响,但是很方便使用
使用语法糖能够增加程序的可读性,减少程序代码出错的机会
"""
import time

def decortor(func):#装饰器
    def wrapper():
        print(time.time())
        func()
    return wrapper

@decortor#像是装饰物一样的东西,@语法糖
def f1():#被装饰的函数
    print('Hello')

f1()
"""
1535815943.6052084
Hello
"""

###########################################被装饰的函数有参数的情况
"""
装饰器的变化
"""
#一个参数的情况
def decortor(func):
    def wrapper(name):
        print(time.time())
        func(name)
    return wrapper

@decortor
def f1(name):#一个参数
    print('Hello'+name)

f1('X')
"""
1535817016.403569
HelloX
"""

#被装饰函数含有多个参数的情况,装饰器如何支持被装饰函数不同个数参数
def decortor(func):
    def wrapper(*ages):#可变参数,ages仅仅只是一个通用的叫法
        print(time.time())
        func(*ages)
    return wrapper

@decortor
def f1(name):#一个参数的情况
    print('Hello'+name)
    
@decortor
def f2(name1,name2):#两个参数的情况
    print('Hello'+name1)
    print('Hello'+name2)

f1('X')
f2('X','F')
"""
1535817762.0832193
HelloX
1535817762.0832193
HelloX
HelloF
"""

#被装饰函数含有关键字参数的情况
def f3(name1,name2,**kw):#普通情况可以打印出来
    print('Hello'+name1)
    print('Hello'+name2)
    print(kw)
f3('X','F',a=1,b=2,c='34')
"""
HelloX
HelloX
{'a': 1, 'b': 2, 'c': '34'}
"""

def decortor(func):
    def wrapper(*ages):
        print(time.time())
        func(*ages)
    return wrapper

@decortor
def f1(name):
    print('Hello'+name)
    
@decortor
def f2(name1,name2):
    print('Hello'+name1)
    print('Hello'+name2)

@decortor
def f3(name1,name2,**kw):#被装饰时出错
    print('Hello'+name1)
    print('Hello'+name2)
    print(kw)

f1('X')
f2('X','F')
f3('X','F',a=1,b=2,c='34')#TypeError: wrapper() got an unexpected keyword argument 'a'

"""
*ages不能兼容关键字参数
解决办法
写好了的装饰器如下
装饰器最终的定义形式
并不是一个被装饰函数只能有一个装饰器,而是可以有多个装饰器,可以@多个
"""
def decortor(func):
    def wrapper(*ages,**kw):#补上关键字参数,同ages,kw只是形参,一个叫法
        print(time.time())
        func(*ages,**kw)#补上
    return wrapper

@decortor
def f1(name):
    print('Hello'+name)
    
@decortor
def f2(name1,name2):
    print('Hello'+name1)
    print('Hello'+name2)

@decortor
def f3(name1,name2,**kw):
    print('Hello'+name1)
    print('Hello'+name2)
    print(kw)

f1('X')
f2('X','F')
f3('X','F',a=1,b=2,c='34')
"""
1535818887.5245907
HelloX
1535818887.525591
HelloX
HelloF
1535818887.525591
HelloX
HelloF
{'a': 1, 'b': 2, 'c': '34'}
"""

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值