广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python编程中装饰器的使用示例解析
  • 473
分享到

Python编程中装饰器的使用示例解析

示例Python 2022-06-04 18:06:52 473人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

装饰函数和方法 我们先定义两个简单的数学函数,一个用来计算平方和,一个用来计算平方差: # get square sum def square_sum(a, b): return a**2 + b*

装饰函数和方法

我们先定义两个简单的数学函数,一个用来计算平方和,一个用来计算平方差:


# get square sum
def square_sum(a, b):
  return a**2 + b**2

# get square diff
def square_diff(a, b):
  return a**2 - b**2

print(square_sum(3, 4))
print(square_diff(3, 4))

在拥有了基本的数学功能之后,我们可能想为函数增加其它的功能,比如打印输入。我们可以改写函数来实现这一点:


# modify: print input

# get square sum
def square_sum(a, b):
  print("intput:", a, b)
  return a**2 + b**2

# get square diff
def square_diff(a, b):
  print("input", a, b)
  return a**2 - b**2

print(square_sum(3, 4))
print(square_diff(3, 4))

我们修改了函数的定义,为函数增加了功能。

现在,我们使用装饰器来实现上述修改:


def decorator(F):
  def new_F(a, b):
    print("input", a, b)
    return F(a, b)
  return new_F

# get square sum
@decorator
def square_sum(a, b):
  return a**2 + b**2

# get square diff
@decorator
def square_diff(a, b):
  return a**2 - b**2

print(square_sum(3, 4))
print(square_diff(3, 4))

装饰器可以用def的形式定义,如上面代码中的decorator。装饰器接收一个可调用对象作为输入参数,并返回一个新的可调用对象。装饰器新建了一个可调用对象,也就是上面的new_F。new_F中,我们增加了打印的功能,并通过调用F(a, b)来实现原有函数的功能。

定义好装饰器后,我们就可以通过@语法使用了。在函数square_sum和square_diff定义之前调用@decorator,我们实际上将square_sum或square_diff传递给decorator,并将decorator返回的新的可调用对象赋给原来的函数名(square_sum或square_diff)。 所以,当我们调用square_sum(3, 4)的时候,就相当于:


square_sum = decorator(square_sum)
square_sum(3, 4)

我们知道,python中的变量名和对象是分离的。变量名可以指向任意一个对象。从本质上,装饰器起到的就是这样一个重新指向变量名的作用(name binding),让同一个变量名指向一个新返回的可调用对象,从而达到修改可调用对象的目的。

与加工函数类似,我们可以使用装饰器加工类的方法。

如果我们有其他的类似函数,我们可以继续调用decorator来修饰函数,而不用重复修改函数或者增加新的封装。这样,我们就提高了程序的可重复利用性,并增加了程序的可读性。

含参的装饰器

在上面的装饰器调用中,比如@decorator,该装饰器默认它后面的函数是唯一的参数。装饰器的语法允许我们调用decorator时,提供其它参数,比如@decorator(a)。这样,就为装饰器的编写和使用提供了更大的灵活性。


# a new wrapper layer
def pre_str(pre=''):
  # old decorator
  def decorator(F):
    def new_F(a, b):
      print(pre + "input", a, b)
      return F(a, b)
    return new_F
  return decorator

# get square sum
@pre_str('^_^')
def square_sum(a, b):
  return a**2 + b**2

# get square diff
@pre_str('T_T')
def square_diff(a, b):
  return a**2 - b**2

print(square_sum(3, 4))
print(square_diff(3, 4))

上面的pre_str是允许参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器。我们可以将它理解为一个含有环境参量的闭包。当我们使用@pre_str('^_^')调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。该调用相当于:


square_sum = pre_str('^_^') (square_sum)

装饰类

在上面的例子中,装饰器接收一个函数,并返回一个函数,从而起到加工函数的效果。在Python 2.6以后,装饰器被拓展到类。一个装饰器可以接收一个类,并返回一个类,从而起到加工类的效果。


def decorator(aClass):
  class newClass:
    def __init__(self, age):
      self.total_display  = 0
      self.wrapped     = aClass(age)
    def display(self):
      self.total_display += 1
      print("total display", self.total_display)
      self.wrapped.display()
  return newClass

@decorator
class Bird:
  def __init__(self, age):
    self.age = age
  def display(self):
    print("My age is",self.age)

eagleLord = Bird(5)
for i in range(3):
  eagleLord.display()

在decorator中,我们返回了一个新类newClass。在新类中,我们记录了原来类生成的对象(self.wrapped),并附加了新的属性total_display,用于记录调用display的次数。我们也同时更改了display方法。

通过修改,我们的Bird类可以显示调用display的次数了。

--结束END--

本文标题: Python编程中装饰器的使用示例解析

本文链接: https://www.lsjlt.com/news/14674.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python编程中装饰器的使用示例解析
    装饰函数和方法 我们先定义两个简单的数学函数,一个用来计算平方和,一个用来计算平方差: # get square sum def square_sum(a, b): return a**2 + b*...
    99+
    2022-06-04
    示例 Python
  • Python函数式编程装饰器的示例分析
    这篇文章给大家分享的是有关Python函数式编程装饰器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、装饰器的本质:装饰器(decorator)本质是函数闭包(function closure)的语法...
    99+
    2023-06-29
  • python装饰器的示例分析
    这篇“python装饰器的示例分析”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“python装饰器的示例分析”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们...
    99+
    2023-06-06
  • python装饰器代码的示例分析
    这篇文章主要介绍python装饰器代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.装饰器通用模型def wrapper(fn):    def&nbs...
    99+
    2023-06-29
  • 实例讲解Python编程中@property装饰器的用法
    取值和赋值 class Actress(): def __init__(self): self.name = 'TianXin' self.age = 5 类Actress中有...
    99+
    2022-06-04
    实例 Python property
  • python中装饰器信号与槽的示例分析
    这篇文章主要为大家展示了“python中装饰器信号与槽的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中装饰器信号与槽的示例分析”这篇文章吧...
    99+
    2022-10-19
  • python中的闭包和装饰器的使用示例
    目录函数参数闭包的构成条件基础的闭包的使用nonloal关键字的使用基础代码实现(装饰器)装饰器的基本使用装饰器的使用有参数的装饰器的使用带有返回值的装饰器带有不定长参数的装饰器带有...
    99+
    2022-11-21
    python闭包和装饰器 python装饰器
  • Python 装饰器常用的创建方式及源码示例解析
    目录装饰器简介基础通用装饰器源码示例执行结果带参数装饰器源码示例源码结果源码解析多装饰器执行顺序源码示例执行结果解析类装饰器源码示例执行结果解析装饰器简介 装饰器(decorator...
    99+
    2022-11-10
  • PHP中装饰器模式的示例分析
    这篇文章主要介绍了PHP中装饰器模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Gof类图及解释GoF定义:将一个类的接口转换成客户希望的另外一个接口。Adapt...
    99+
    2023-06-20
  • Python中使用装饰器来优化尾递归的示例
    尾递归简介 尾递归是函数返回最后一个操作是递归调用,则该函数是尾递归。 递归是线性的比如factorial函数每一次调用都会创建一个新的栈(last-in-first-out)通过不断的压栈,来创建递归, ...
    99+
    2022-06-04
    递归 示例 Python
  • Python - 装饰器使用过程中的误
    装饰器基本概念 大家都知道装饰器是一个很著名的设计模式,经常被用于 AOP (面向切面编程)的场景,较为经典的有插入日志,性能测试,事务处理,Web权限校验, Cache等。 Python 语言本身提供了装饰器语法(@),典型的装饰器实现...
    99+
    2023-01-31
    过程中 Python
  • Python装饰器中@property使用详解
    目录最初的声明方式使用装饰器的声明方式使用装饰器的调用过程总结最初的声明方式 在没有@property修饰的情况下,需要分别声明get、set、delete函数,然后初始化prope...
    99+
    2022-11-13
  • Python中的装饰器使用
    目录Python装饰器总结Python装饰器 Python的装饰器是个好东西,它能干很多事情。 但对于新手,它看起来似乎没那么简单。 但事实上,装饰器本身也只是个函数。 import...
    99+
    2022-12-19
    Python装饰器使用 装饰器使用 Python装饰器
  • Python黑魔法@property装饰器的使用技巧解析
    @property有什么用呢?表面看来,就是将一个方法用属性的方式来访问. 上代码,代码最清晰了. class Circle(object): def __init__(self, rad...
    99+
    2022-06-04
    使用技巧 黑魔法 Python
  • Python编程super应用场景及示例解析
    目录一、什么是super三、super的常用使用场景一、什么是super 1.super也是一个类,是的。他不是一个方法也不是一个内置的关键字。 class A: pas...
    99+
    2022-11-12
  • 理解python中装饰器的作用
    装饰器的作用就是用一个新函数封装旧函数(是旧函数代码不变的情况下增加功能)然后会返回一个新函数,新函数就叫做装饰器,一般为了简化装饰器会用语法糖@新函数来简化 例子: 这是一段代码,...
    99+
    2022-11-12
  • python中asyncio异步编程的示例分析
    这篇文章将为大家详细讲解有关python中asyncio异步编程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.   想学asyncio,得先了解协程携程的意义:计算型的操...
    99+
    2023-06-14
  • Python函数装饰器的使用详解
    目录装饰器装饰器的定义装饰器的意义装饰器的使用无参装饰器有参装饰器实例练习总结装饰器 装饰器的定义 关于装饰器的定义,我们先来看一段github上大佬的定义: Function de...
    99+
    2022-11-12
  • Python函数装饰器的使用教程
    目录典型的函数装饰器叠放装饰器参数化装饰器标准库中的装饰器functools.wrapsfunctools.lru_cachefunctools.singledispatch小结参考资料:典型的函数装饰器 以下示例...
    99+
    2022-06-02
    python 装饰器 python 函数装饰器
  • 使用Python编程语言进行实践的示例分析
    这篇文章将为大家详细讲解有关使用Python编程语言进行实践的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。其实Python真的挺有意思的,用Python用做过不少有趣好玩的事儿,这...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作