zoukankan      html  css  js  c++  java
  • 27 Python 装饰器

    一. 我们先写一个玩游戏的步骤

    # def play():
    #     print("双击LOL")
    #     print("选择狂战士")
    #     print("进草丛")
    #     print("崩山击","十字斩")
    我们想添加
      1.开挂
      2.关闭外挂
      目标函数前和后插入一段新代码 不改变原来代码
    # def wrapper(fn):
    #     def inner():
    #         print("开挂")
    #         fn()
    #         print("关闭外挂")
    #     return inner
    #
    # play = wrapper(play)
    #
    # play()

    通用装饰器的语法:

    def wrapper(fn):
        def inner(*args, **kwargs): # 聚合
            """在目标函数之前的内容"""
            ret = fn(*arg, **kwargs) # 打散
            """在目标函数之后的内容"""
            return ret
        return inner
    @wrapper
    def func():
        pass
    func()

    同一个函数被多个装饰器装饰

    def wrapper1(fn):
        def inner(*args, **kwargs):
            print("1")
            ret = fn(*args, **kwargs)
            print("2")
            return ret
        return inner
    
    def wrapper2(fn):
        def inner(*args, **kwargs):
            print("3")
            ret = fn(*args, **kwargs)
            print("4")
            return ret
        return inner
    
    def wrapper3(fn):
        def inner(*args, **kwargs):
            print("5")
            ret = fn(*args, **kwargs)
            print("6")
            return ret
        return inner
    # 顺序 1 2 3  func 3 2 1
    @wrapper1
    @wrapper2
    @wrapper3
    def func():
        print("装饰器不难  滑稽脸)")
    func()  # 1 3 5 装饰器不难  滑稽脸 6 4 2

    带参数的装饰器

    def wrapper_out(参数):
            def wrapper(fn):
                def inner(*args, **kwargs): # 聚合
                    """在目标函数之前的内容"""
                    ret = fn(*arg, **kwargs) # 打散
                    """在目标函数之后的内容"""
                    return ret
                return inner
            return wrapper
    @wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
    def func():
        pass
  • 相关阅读:
    Java之美[从菜鸟到高手演变]之设计模式
    Akka边学边写(1)-- Hello, World!
    [D3 + AngularJS] 15. Create a D3 Chart as an Angular Directive
    [D3] 14. Line and Area Charts with D3
    [D3] 13. Cleaner D3 code with selection.call()
    [D3] 12. Basic Transitions with D3
    [D3] 9. Scatter Plot
    [D3] 8. Margins
    [D3] 7. Quantitative Scales
    Runoob-Java-高级教程-实例-字符串:09. Java 实例
  • 原文地址:https://www.cnblogs.com/a2534786642/p/10121413.html
Copyright © 2011-2022 走看看