Fork me on GitHub

随笔 - 997  文章 - 5  评论 - 181  阅读 - 300万 

前记

  python小白,估计很多没用过这个高级功能吧,当你用了它之后就会发现,真是非常好用喔。
  装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

概念实例

  • 简单装饰器
      简单装饰器一般有两种写法,一种是直接定义函数,另外一种是使用@这个装饰器的语法糖来操作,下面以一个例子做结束:
import logging

def use_logging(func):

    def wrapper():
        logging.warning("%s is running" % func.__name__)
        return func()   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
    return wrapper

def foo():
    print('i am foo')

foo = use_logging(foo)  # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于  foo = wrapper
foo()                   # 执行foo()就相当于执行 wrapper()

@use_logging
def apple():
    print("I am apple")


apple()
  • 带参数的装饰器
      装饰器灵活性非常的高,它可以允许自带参数,这里就是一个自带参数的装饰器例子:
import logging

def use_logging(level):

    def decorator(func):
        def wrapper(*args, **kwargs):
            if level == "warn":
                logging.warning("%s is running" % func.__name__)
            return func(*args)   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
        return wrapper
    return decorator


@use_logging(level="warn")
def apple(name='apple'):
    print("I am %s "%name)


apple("apple")

  • 类装饰器

  相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。下面看一个例子;

class cat(object):
    def __init__(self,func):
        self._func = func

    def __call__(self):
        print("class decorator running")
        self._func()
        print("class decorator ending")


@cat
def bar():
    print("bar is running")

bar()

posted on   虚生  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示