9-装饰器

装饰器基础#

  • 使用装饰器可以增加程序的灵活性,减少耦合度,适合使用在用户登陆检查、日志处理等方面

  • 装饰器语法

    • # Python装饰器语法:
      def out(f):
          def inner():
              f()
              print('这里写增加的装饰功能')
          return inner
      
    • 闭包

    • 装饰器内部调用函数

    • 函数的上下添加装饰

  • 函数调用

    • house = out(house)
      • # print(house._name_) # inner,house指向inner函数
    • house指向的函数是装饰器的内部函数(inner)
  • 给函数加装饰器

    • @装饰器

通用装饰器#

  • 通用指的是带通用参数

  • 通用装饰器语法

    • def outer2(f):
          def inner(*args, **kwargs):
              print('开始唱歌了')
              r = f(*args, **kwargs)
              print('唱完了')
              return r
          return inner
      
      @outer2
      def sing2(singer, song, a):
          print(singer, '唱:', song, a)
          return 'Nice'
      
      result = sing2('贾玲', '老女孩', a=1)
      print(result)
      '''
      开始唱歌了
      贾玲 唱: 老女孩 1
      唱完了
      Nice
      '''
      
    • 如果原函数有返回值,那么装饰器函数也要有返回值进行返回,这样才能确保对原函数不做修改

  • 装饰器调用时使用参数

    • # 装饰器调用时使用参数,相当于多加了一个参数层
      def outer(is_hello):
          def inner(f):
              def inner_inner(*args, **kwargs):
                  if is_hello == 'hello':
                      print('hello Python')
                      return f(*args, **kwargs)
                  else:
                      return f(*args, **kwargs)
              return inner_inner
          return inner
      
      @outer('hello')  # 加装饰器
      def f_temp(*args, **kwargs):
          print(*args, **kwargs)
      
      # 调用
      f_temp('你好,世界')
      '''
      hello Python
      你好,世界
      '''
      
    • 如果装饰器在调用时使用了参数,那么装饰器函数只会使用这些参数进行调用,因此需要返回一个新的装饰器函数,这样就与普通的装饰器一致

栈和队列#

    • 栈:一种数据结构

    • 特点:先进后出,后进先出

    • 列表可以实现栈结构,控制只在一端(只在列表末尾)插入append和取出pop

    • from queue import LIFOQueue

      • from queue import LifoQueue
        stack = LifoQueue(maxsize=3)
        stack.put('hello')
        stack.put('world')
        print(stack.get())  # world
        print(stack.get())  # hello
        
  • 队列

    • 队列:一种数据结构

    • 特点:先进先出,后进后出,类似排队

    • 创建队列

      • # 创建队列
        import collections.abc
        queue = collections.deque()
        print(queue)  # deque([])
        
    • 入队列:append

    • 出队列:popleft

作者:lotuslaw

出处:https://www.cnblogs.com/lotuslaw/p/14007494.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   lotuslaw  阅读(78)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示