python 装饰器的使用示例

 更新时间:2020年10月10日 11:34:55   作者:南方的墙  
这篇文章主要介绍了python 装饰器的使用示例,帮助大家更好的理解和使用python装饰器,感兴趣的朋友可以了解下

无参修饰 ,无参数时不需要调用

def log1(func):
  func()
@log1
def test():
  print('test:')

有参修饰

def log2(func):
  def inner(*args, **kwargs):
    func(*args, **kwargs)
  return inner
@log2
def test(num):
  print('testlog2:',num,test.__name__)
test(20) #相当于log(test(20))

@wraps可以保证装饰器修饰的函数的name的值保持不变

不带参数的装饰器

def log3(func):
  @wraps(func)
  def inner(*args, **kwargs,):
    func(*args, **kwargs)
  return inner
@log3
def test(num):
  print('testlog3:',num,test.__name__)
test(30) #相当于log(test(30))

带参数的装饰器

def log4(level):
  def log(func):
    @wraps(func)
    def inner(*args, **kwargs,):
      if level == "warn":
        print("%s is running" % func.__name__)
      func(*args, **kwargs)
    return inner
  return log
@log4(level="warn")
def test(num):
  print('testlog4:', num, test.__name__)
test(40)

实现带参数和不带参数的装饰器自适应

def log(arg):
  if callable(arg): # 判断参入的参数是否是函数,不带参数的装饰器调用这个分支
    def log3(func):
      @wraps(func)
      def inner(*args, **kwargs, ):
        func(*args, **kwargs)
      return inner
    return log3
  else:
    def log4(func):
      @wraps(func)
      def inner(*args, **kwargs,):
        if arg == "warn":
          print("%s is running" % func.__name__)
        func(*args, **kwargs)
      return inner
    return log4
@log(arg=None)
def test(num):
  print('testlog:', num, test.__name__)
test(0)

返回入参出参

def log5(func):
  def inner(*args, **kwargs):
    print('入参:',func.__name__, args, kwargs)
    res =func(*args, **kwargs)
    print('出参:',func.__name__, res)
    return res
  return inner
@log5
def test(num):
  print('testlog5:', num, test.__name__)
  return num
print(test(50))

类装饰器

class Loging:
  def __init__(self,level):
    self.level = level

  def __call__(self,func):
    @wraps(func)
    def inner(*args, **kwargs):
      if self.level == "warn":
        self.notify(func)
      func(*args, **kwargs)
    return inner

  def notify(self,func):
    print ("%s is running" % func.__name__)


@Loging(level="warn")
def test(num):
  print('testLoging:', num, test.__name__)
test(0)

以上就是python 装饰器的使用示例的详细内容,更多关于python 装饰器的资料请关注脚本之家其它相关文章!

相关文章

  • Python只用40行代码编写的计算器实例

    Python只用40行代码编写的计算器实例

    这篇文章主要介绍了Python只用40行代码编写的计算器,结合完整实例形式分析了Python计算器的具体实现技巧,需要的朋友可以参考下
    2017-05-05
  • Python绑定方法与非绑定方法详解

    Python绑定方法与非绑定方法详解

    这篇文章主要为大家详细 介绍了Python绑定方法与非绑定方法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • python爬虫实战之爬取京东商城实例教程

    python爬虫实战之爬取京东商城实例教程

    这篇文章主要介绍了python爬取京东商城的相关资料,文中通过爬取一个实例页面进行了讲解,通过示例代码和图文介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起学习学习吧。
    2017-04-04
  • Python 动态绑定属性和方法 

    Python 动态绑定属性和方法 

    这篇文章主要介绍了Python 动态绑定属性和方法, 动态语言与静态语言有很多不同,最大的特性之一就是可以实现动态的对类和实例进行修改,在Python中,我们创建了一个类后可以对实例和类绑定心的方法或者属性,实现动态绑定,下面详细介绍需要的朋友可以参考一下
    2022-03-03
  • 浅谈pytorch中stack和cat的及to_tensor的坑

    浅谈pytorch中stack和cat的及to_tensor的坑

    这篇文章主要介绍了pytorch中stack和cat的及to_tensor的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • 在PyCharm中控制台输出日志分层级分颜色显示的方法

    在PyCharm中控制台输出日志分层级分颜色显示的方法

    今天小编就为大家分享一篇在PyCharm中控制台输出日志分层级分颜色显示的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python实现为Excel中每个单元格计算其在文件中的平均值

    Python实现为Excel中每个单元格计算其在文件中的平均值

    这篇文章主要为大家详细介绍了如何基于Python语言实现对大量不同的Excel文件加以跨文件、逐单元格平均值计算,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Python 把两层列表展开平铺成一层(5种实现方式)

    Python 把两层列表展开平铺成一层(5种实现方式)

    这篇文章主要介绍了Python 把两层列表展开平铺成一层(5种实现方式),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Python安装模块的常见问题及解决方法

    Python安装模块的常见问题及解决方法

    下面小编就为大家分享一篇Python安装模块的常见问题及解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • python基于concurrent模块实现多线程

    python基于concurrent模块实现多线程

    这篇文章主要介绍了python基于concurrent模块实现多线程,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04

最新评论