ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

#python&装饰器(*****)

2022-01-24 10:30:38  阅读:146  来源: 互联网

标签:paly play dnf python inner print 装饰 def


内容回顾:
1. 函数可以做为参数进行传递
2. 函数可以作为返回值进行返回
3. 函数名称可以当成变量一样进行赋值操作

装饰器: -> 要求记住最后的结论
装饰器本质上是一个闭包
作用:
在不改变原有函数调用的情况下,给函数增加新的功能:
直白:可以在函数前后添加新功能,但是不改原来的代码

 在用户登录的地方,日志。
 通用装饰器的写法:
    def wrapper(fn):  wrapper:装饰器, fn:目标函数
    def inner(*args,**kwargs):
      # 在目标函数执行之前.......
      ret = fn(*args,**kwargs)       #  执行目标函数
      # 在目标函数执行之后......
      return ret
    return inner  # 注意的是没有加括号,不然会把函数给执行了 坑! 
   # 把内存函数给返回   #()是把内存函数执行的结果给返回了
   @wrapper
   def target():
        pass

   target() # => inner()

一个函数可以被多个装饰器装饰:
 @wrapper1
 @wrapper2
 def target():
 
规则和规律  wrapper1 wrapper2 target wrapper2 wrapper1

#案例

# 1
# def func():
#     print('我是函数')
#
#  def gggg(fn):  # fn要求是个函数
#     fn()  # func()
#
# gggg(func)

# def func():
#     def inner():
#         print("123")
#     return inner
#
# ret = func()
# ret()

# def func1():
#     print("我是函数1")
#
# def func2():
#     print("我是函数2")
#
# func1 = func2
#
# func1()

# def guanjia(game):
#     def inner():
#         print("打开外挂")
#         game()  # 玩起来了
#         print("关闭外挂")
#     return inner
#
#
# @guanjia   # 相当于 play_dnf = guanjia(play_dnf)
# def paly_dnf():
#     print("你好啊,我叫赛利亚,今天又是美好的一天")
#
# @guanjia      #  相当于   play_lol = guanjia(play_lol)
# def play_lol():
#     print("德玛西亚!!!!!!")
#
#
# paly_dnf() # 此时运行的是管家给的内层函数inner
# play_lol()

# paly_dnf = guanjia(paly_dnf)  # 让管家把游戏重新封装一遍,我这边把原来的游戏替换了
# play_lol = guanjia(play_lol)  # 让管家把lol也重新封装一下
#



# paly_dnf()  # 重复输出
# paly_dnf()
# paly_dnf()
# paly_dnf()
# paly_dnf()
# paly_dnf()
# paly_dnf()


# print("开挂")
# paly_dnf()
# print("关闭外挂")
#
#
#
#
# print("开挂")
# play_lol()
# print("关闭外挂")

# 2
# def guanjia(game):
#     #  * ,**表示接收所有参数,打包成元组和字典
#     def inner(*args, **kwargs):  # inner 添加了参数,args一定是一个元组 kwargs 一定是字典 ('admin' , ‘)
#         print("打开外挂")
#         #  * , ** 表示把argss元组和kwargs 字典打散成 位置参数以及关键字参数传递进去
#         game(*args, **kwargs)  # 玩起来了  # game('admin' ,'123456')
#         print("关闭外挂")
#     return inner
#
# @guanjia    # play_dnf = guanjia(play_dnf)
# def paly_dnf(username, password):
#     print("我要开始玩儿dnf", username, password)
#     print("你好啊,我叫赛利亚,今天又是美好的一天")
#
#
#
# @guanjia  # play_lol = guanjia(play_lol)
# def play_lol(username , password,hero):
#     print("我要开始玩儿lol", username, password, hero)
#     print("德玛西亚!!!!!!")
#
#
# paly_dnf("admin", "123456")
# play_lol("admin", "1234567", "剑圣")


# 3

# def guanjia(game):
#     def inner(*args, **kwargs):
#         print("打开外挂")
#         ret = game(*args, **kwargs) # 这里是目标函数的执行 ,这里是能够拿到从目标函数返回的返回值的。
#         print("关闭外挂")
#         return ret
#     return inner
#
# @guanjia
# def paly_dnf(username, password):
#     print("我要开始玩儿dnf", username, password)
#     print("你好啊,我叫赛利亚,今天又是美好的一天")
#     return "一把屠龙刀"
#
#
# def play_lol(username , password,hero):
#     print("我要开始玩儿lol", username, password, hero)
#     print("德玛西亚!!!!!!")
#
#
# ret = paly_dnf("admin", "123456")  # inner
# print(ret)
#
#
# # play_lol("admin", "1234567", "剑圣")

# 4

#综合案例篇
# 1 
# def wrapper1(fn):  # fn: wraaper2.inner
#     def inner(*arg,**kwargs):
#         print("这里是wrapper1 进入") # 1 wrapper2.inner
#         ret = fn(*arg,**kwargs)
#         print("这里是wrapper1 出去")  # 5
#         return ret
#     return inner
#
# # 2
#
# def wrapper2(fn): # fn: target
#     def inner(*arg,**kwargs):
#         print("这里是wrapper2 进入") # 2
#         ret = fn(*arg,**kwargs)  # target
#         print("这里是wrapper2 出去") # 4
#         return ret
#     return inner
#
#
# @wrapper1  # target = wrapper1(wrapper2.inner) => target: wrapp1.inner
# @wrapper2  # target = wrapper2(target) => target:wrapper2.inner
# def target():
#     print("我的目标") # 3
#
# target()

# wrapper1 wrapper2 target wrapper2 wrapper1

"""
这里是wrapper1 进入
这里是wrapper2 进入
我的目标
这里是wrapper2 出去
这里是wrapper1 出去
"""

login_flag = False

def login_verify(fn):
    def inner(*args,**kwargs):
        # 这里完成登录校验
        global login_flag
        if login_flag == False:
            print("还未完成用户登录操作")
            while 1:
                username = input(">>>")
                password = input(">>>")
                if username =="admin" and password =="123":
                    print("登录成功")
                    login_flag = True
                    break
                else:
                    print("登录失败,用户名或密码错误")
        ret = fn(*args,**kwargs)
    return inner

@login_verify
def add():
    print("添加员工信息")

@login_verify
def delete():
    print("删除信息")

@login_verify
def upd():
    print("修改信息")

@login_verify
def search():
    print("查询员工信息")

add()
delete()
upd()
search()

标签:paly,play,dnf,python,inner,print,装饰,def
来源: https://blog.csdn.net/weixin_48321071/article/details/122662203

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有