Python中的装饰器可以做什么
admin
2023-08-01 02:20:06
0

阅读目录

一 什么是装饰器

二 装饰器需要遵循的原则

三 实现装饰器知识储备

四 高阶函数

五 函数嵌套

六 闭包

七 无参装饰器

八 装饰器应用示例

一 什么是装饰器

器即函数

装饰即修饰,意指为其他函数添加新功能

装饰器定义:本质就是函数,功能是为其他函数添加新功能

二 装饰器需要遵循的原则

1.不修改被装饰函数的源代码(开放封闭原则)

2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

三 实现装饰器知识储备

装饰器=高阶函数+函数嵌套+闭包

四 高阶函数

高阶函数定义:

1.函数接收的参数是一个函数名

2.函数的返回值是一个函数名

3.满足上述条件任意一个,都可称之为高阶函数

 def foo():

    print('我的函数名作为参数传给高阶函数')

def gao_jie1(func):

    print('我就是高阶函数1,我接收的参数名是%s' %func)

    func()

def gao_jie2(func):

    print('我就是高阶函数2,我的返回值是%s' %func)

    return func

gao_jie1(foo)

gao_jie2(foo)

 #高阶函数应用1:把函数当做参数传给高阶函数

import time

def foo():

    print('from the foo')

def timmer(func):

    start_time=time.time()

    func()

    stop_time=time.time()

    print('函数%s 运行时间是%s' %(func,stop_time-start_time))

timmer(foo)

#总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式

 #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名

import time

def foo():

    print('from the foo')

def timmer(func):

    start_time=time.time()

    return func

    stop_time=time.time()

    print('函数%s 运行时间是%s' %(func,stop_time-start_time))

foo=timmer(foo)

foo()

#总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能

 高阶函数总结

1.函数接收的参数是一个函数名

  作用:在不修改函数源代码的前提下,为函数添加新功能,

  不足:会改变函数的调用方式

2.函数的返回值是一个函数名

  作用:不修改函数的调用方式

  不足:不能添加新功能

五 函数嵌套

  1 def father(name):

 2     print('from father %s' %name)

 3     def son():

 4         print('from son')

 5         def grandson():

 6             print('from grandson')

 7         grandson()

 8     son()

 9 

10 father('tom')

六 闭包

  1 '''

 2 闭包:在一个作用域里放入定义变量,相当于打了一个包

 3 '''

 4 def father(name):

 5     def son():

 6         # name='jack'

 7         print('is [%s]' %name)

 8         def grandson():

 9             # name='wupeiqi'

10             print('is [%s]' %name)

11         grandson()

12     son()

13 

14 father('jack')

七 无参装饰器

无参装饰器=高级函数+函数嵌套

基本框架

1 #这就是一个实现一个装饰器最基本的架子

2 def timer(func):

3     def wrapper():

4         func()

5     return wrapper

加上参数

1 def timer(func):

2     def wrapper(*args,**kwargs):

3         func(*args,**kwargs)

4     return wrapper

加上功能

 1 import time

2 def timer(func):

3     def wrapper(*args,**kwargs):

4         start_time=time.time()

5         func(*args,**kwargs)

6         stop_time=time.time()

7         print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))

8     return wrapper

 加上返回值

 1 import time

2 def timer(func):

3     def wrapper(*args,**kwargs):

4         start_time=time.time()

5         res=func(*args,**kwargs)

6         stop_time=time.time()

7         print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))

8         return res

9     return wrapper

 使用装饰器

 1 def cal(array):

2     res=0

3     for i in array:

4         res+=i

5     return res

7 cal=timer(cal)

8 cal(range(10))

 语法糖@

 1 @timer  #@timer就等同于cal=timer(cal)

2 def cal(array):

3     res=0

4     for i in array:

5         res+=i

6     return res

8 cal(range(10))

八 装饰器应用示例

 user_list=[

    {'name':'alex','passwd':'123'},

    {'name':'linhaifeng','passwd':'123'},

    {'name':'wupeiqi','passwd':'123'},

    {'name':'yuanhao','passwd':'123'},

]

current_user={'username':None,'login':False}

def auth_deco(func):

    def wrapper(*args,**kwargs):

        if current_user['username'] and current_user['login']:

            res=func(*args,**kwargs)

            return res

        username=input('用户名: ').strip()

        passwd=input('密码: ').strip()

        for index,user_dic in enumerate(user_list):

            if username == user_dic['name'] and passwd == user_dic['passwd']:

                current_user['username']=username

                current_user['login']=True

                res=func(*args,**kwargs)

                return res

                break

        else:

            print('用户名或者密码错误,重新登录')

    return wrapper

@auth_deco

def index():

    print('欢迎来到主页面')

@auth_deco

def home():

    print('这里是你家')

def shopping_car():

    print('查看购物车啊亲')

def order():

    print('查看订单啊亲')

print(user_list)

# index()

print(user_list)

home()

 user_list=[

    {'name':'tom','passwd':'123'},

    {'name':'jack','passwd':'123'},

  ]

current_user={'username':None,'login':False}

def auth(auth_type='file'):

    def auth_deco(func):

        def wrapper(*args,**kwargs):

            if auth_type == 'file':

                if current_user['username'] and current_user['login']:

                    res=func(*args,**kwargs)

                    return res

                username=input('用户名: ').strip()

                passwd=input('密码: ').strip()

                for index,user_dic in enumerate(user_list):

                    if username == user_dic['name'] and passwd == user_dic['passwd']:

                        current_user['username']=username

                        current_user['login']=True

                        res=func(*args,**kwargs)

                        return res

                        break

                else:

                    print('用户名或者密码错误,重新登录')

            elif auth_type == 'ldap':

                print('auth')

                res=func(*args,**kwargs)

                return res

        return wrapper

    return auth_deco

#auth(auth_type='file')就是在运行一个函数,然后返回auth_deco,所以@auth(auth_type='file')

#就相当于@auth_deco,只不过现在,我们的auth_deco作为一个闭包的应用,外层的包auth给它留了一个auth_type='file'参数

@auth(auth_type='ldap')

def index():

    print('欢迎来到主页面')

@auth(auth_type='ldap')

def home():

    print('home')

def shopping_car():

    print('shopping')

def order():

    print('check order')

# print(user_list)

index()

# print(user_list)

home()

相关内容

热门资讯

走访茉莉花都横州:大片花田浸泡... 受今年第10号台风“美莎克”持续影响,广西南宁横州市遭遇极端强降雨,境内多座水库出现漫顶及缺口情况、...
这场震惊世人的中国在德留学生性... “大多数人读起这个事情,他们会觉得这些人(加害者)一定是很可怕的人吧?但是其实不是,他们在生活中是非...
美国人,真的“不懂球”吗? 美国人为什么不喜欢足球?刘骁骞带着这个问题走进美墨边境、锈带水牛城和洛杉矶的球场。他发现足球在美国的...
特朗普:将向乌克兰授予制造爱国... 7月8日,在北约峰会记者会上,特朗普暗示欧洲和乌克兰可能获得“爱国者”导弹生产许可证。特朗普被问及,...
世界杯,玩脏的 作者 | 凌川儿 编辑 | 阿树FIFAmerica,一个由FIFA(国际足联)和America(美...
视频丨转移群众 抢修道路 广西... 近期广西多地遭遇极端天气,造成灾情,多方争分夺秒,持续抢险救灾。广西横州:水库严重险情后紧急抢修受灾...
乌军声称击落一架俄苏-35战斗... 当地时间8日,乌克兰武装部队空军表示,当天在东部方向击落了一架俄罗斯苏-35多用途战斗机。俄罗斯方面...
海信变频空调kfr-26w27... 可能是因为控制面板故障,需要拆开控制面板请专业人员修理或更换控制面板来解决;可能是因为电源接触不良,...
空调p1是什么故障码 1、空调显示p1的意思是空调的供电电压可能太高了或者是太低了,这种情况下空调自然就会出现p1故障。2...
空调显示h1代码怎么办-空调故... 众所周知,在目前生活中空调的应用是十分普及的,但是由于长时间的使用,空调也难免会出现一些故障,当空调...