首页 > 编程语言 >python装饰器decorator的应用

python装饰器decorator的应用

时间:2024-11-13 11:57:17浏览次数:1  
标签:函数 python 参数 def func print 装饰 decorator

python中的装饰器类似于java中的AOP切面编程的思想,下面通过demo教大家如何实现

(1)一个最简单的装饰器 demo1

 

#一个最简单的装饰器
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

 

 结果:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

 

(2)装饰器中如何传递函数中的参数 demo2

#装饰器中如何传递函数中的参数
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

 结果:

Something is happening before the function is called.
Hello, Alice!
Something is happening after the function is called.

(3)多个装饰器 demo3

#多个装饰器
def decorator1(func):
    def wrapper(*args, **kwargs):
        print("Decorator 1")
        return func(*args, **kwargs)
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        print("Decorator 2")
        return func(*args, **kwargs)
    return wrapper

@decorator1
@decorator2
def say_hi():
    print("Hi!")

say_hi()

 结果:

Decorator 1
Decorator 2
Hi!

(4)当作注解,使用 @装饰器名(装饰器参数) 绑定到函数上 demo4

#conding=utf-8

#给装饰器 传递参数

def decorator(arg_1, arg_2):
    """
    装饰器是一个自定义函数,可以接收我们指定的参数,
    其内部内嵌了两层函数,用于接收函数本身和函数参数.
    因此我们有两种使用装饰器的方法:(该样例使用第一种)
    ① 当作注解,使用 @装饰器名(装饰器参数) 绑定到函数上
    ② 当作函数,使用 装饰器名(装饰器参数)(函数名)(函数参数) 来一次性调用
    我们在装饰器内部拿到了函数和其参数,因此有较大的自由度可以决定如何调用目标函数。
    """
    def wrapper(func):
        def func_wrapper(*args, **kw):

            print(func.__name__)
            print(f"装饰器参数1: {arg_1}, 装饰器参数2: {arg_2}")
            print("执行函数前做点什么")

            result = func(*args, **kw)


            print("执行函数后做点什么")
            print(f"目标函数运行返回值:{result}")
            return result

        return func_wrapper

    return wrapper


# 加法函数
@decorator("参数1", "参数2")
def add(arg_1: int, arg_2: int):
    print(f"目标函数开始执行, 函数参数为: {arg_1},{arg_2}")
    return arg_1 + arg_2



if __name__ == '__main__':
    print("=" * 10)
    # 绑定注解形式调用
    add(3, 5)

 结果:

==========
add
装饰器参数1: 参数1, 装饰器参数2: 参数2
执行函数前做点什么
目标函数开始执行, 函数参数为: 3,5
执行函数后做点什么
目标函数运行返回值:8

(5)当作函数,使用 装饰器名(装饰器参数)(函数名)(函数参数) 来一次性调用 demo5

#conding=utf-8

#给装饰器 传递参数

def decorator(arg_1, arg_2):
    """
    创建装饰器。
    装饰器是一个自定义函数,可以接收我们指定的参数,
    其内部内嵌了两层函数,用于接收函数本身和函数参数.
    因此我们有两种使用装饰器的方法:(该样例使用第二种)
    ① 当作注解,使用 @装饰器名(装饰器参数)  绑定到函数上
    ② 当作函数,使用 装饰器名(装饰器参数)(函数名)(函数参数) 来一次性调用
    我们在装饰器内部拿到了函数和其参数,因此有较大的自由度可以决定如何调用目标函数。
    """
    def wrapper(func):
        def func_wrapper(*args, **kw):

            print(func.__name__)
            print(f"装饰器参数1: {arg_1}, 装饰器参数2: {arg_2}")
            print("执行函数前做点什么")

            result = func(*args, **kw)


            print("执行函数后做点什么")
            print(f"目标函数运行返回值:{result}")
            return result

        return func_wrapper

    return wrapper


# 加法函数
@decorator("参数1", "参数2")
def add(arg_1: int, arg_2: int):
    print(f"目标函数开始执行, 函数参数为: {arg_1},{arg_2}")
    return arg_1 + arg_2



if __name__ == '__main__':
    print("=" * 10)
    # 绑定注解形式调用
    # 一次性调用
    decorator("参数_1", "参数_2")(add)(3,5)

 结果:

==========
func_wrapper
装饰器参数1: 参数_1, 装饰器参数2: 参数_2
执行函数前做点什么
add
装饰器参数1: 参数1, 装饰器参数2: 参数2
执行函数前做点什么
目标函数开始执行, 函数参数为: 3,5
执行函数后做点什么
目标函数运行返回值:8
执行函数后做点什么
目标函数运行返回值:8

(6)类装饰器 demo6

#conding=utf-8

#类装饰器
class MyDecorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("Something is happening before the function is called.")
        result = self.func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result

@MyDecorator
def say_goodbye():
    print("Goodbye!")

say_goodbye()

 结果:

Something is happening before the function is called.
Goodbye!
Something is happening after the function is called.

 

 源码获取方式(免费):
(1)登录-注册:http://resources.kittytiger.cn/
(2)搜索:python装饰器decorator的应用

标签:函数,python,参数,def,func,print,装饰,decorator
From: https://www.cnblogs.com/yclh/p/18543620

相关文章

  • Python模块之manim (动画模块)
    模块作用简介:Python模块之manim(动画模块)官方英文帮助:https://docs.python.org/3/library/官方简体中文帮助:https://docs.python.org/zh-cn/3/library/manim官方:https://docs.manim.community/en/stable/installation.html必要操作:>>>frommanimimport*......
  • python中利用/和*控制位置参数和关键字参数
    python中利用/和*控制位置参数和关键字参数内容是的,在Python中,/和*都可以用在函数参数定义中,用来控制参数的传递方式。具体来说:/:表示位置参数(positional-onlyparameters),即只能按位置传递的参数。*:表示关键字参数(keyword-onlyparameters),即只能按关键字传递的参数。......
  • python之类
    一、介绍类类(class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例实例化:创建一个类的实例,类的具体对象。对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法方法:类中定义的函数类变量:......
  • 第七课 Python之类
    一、介绍类类(class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例实例化:创建一个类的实例,类的具体对象。对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法方法:类中定义的函数类变量:......
  • python两组概念辨析:__getitem__ .vs. getitem & __getattr__ .vs. getattr
    python两组概念辨析:getitem.vs.getitem&getattr.vs.getattr内容在Python中,__getitem__、__getattr__、getitem和getattr都是与对象属性访问和方法相关的概念,但是它们的作用和使用场景有很大的区别。下面我将详细分析它们之间的区别,并解释哪些是Python特有的。1._......
  • Python绘制循环渐变圆
    通过改变颜色,圆的半径,及旋转角度来形成圆图形importturtleimportcolorsysascs#导入颜色转换模块#设置显示屏幕screen=turtle.Screen()screen.title("渐变色的圆")screen.bgcolor('#AFEEEE')#设置画笔p=turtle.Turtle()p.pensize(1)p.speed(0)#设置......
  • 走进科学IT版:两个控制台窗口,一个python命令报错一个不报错
    真是碰到走进科学那样的灵异事件了,同一个目录下,一样的python环境,一样pyramid的服务,两个控制台窗口,一个终端可以启动,另一个终端就启动不了。都是这一条命令pythonpyramid_app.py不能启动的终端,报错:pythonpyramid_app.pyTraceback(mostrecentcalllast):File"/User......
  • 使用wxpython开发跨平台桌面应用,对WebAPI调用接口的封装
    我在前面介绍的系统界面功能,包括菜单工具栏、业务表的数据,开始的时候,都是基于模拟的数据进行测试,数据采用JSON格式处理,通过辅助类的方式模拟实现数据的加载及处理,这在开发初期是一个比较好的测试方式,不过实际业务的数据肯定是来自后端,包括本地数据库,SqlServer、Mysql、Oracle、Sql......
  • 【新人系列】Python 入门(九):数据结构 - 中
    ✍个人博客:https://blog.csdn.net/Newin2020?type=blog......
  • Python 第三方库 PyQt5 的安装
    目录前言PyQt5安装不同操作系统PyQt5安装一、Windows系统二、macOS系统三、Linux系统(以Ubuntu为例)安装PyQt5可能会遇到的问题一、环境相关问题二、依赖问题三、网络问题四、安装工具问题五、运行时问题六、环境配置问题七、安装源问题八、检查错误信息......