首页 > 编程语言 >Python 以类作为装饰器 几种使用场景

Python 以类作为装饰器 几种使用场景

时间:2023-12-16 13:00:45浏览次数:34  
标签:__ ... 场景 func Python self 以类 print def

1. 原函数、装饰器 都 没有参数

代码:

class Test:
    def __init__(self, func):
        print('Be in __init__ process...')
        self.__func = func
    
    def __call__(self):
        print("...Start decorate...")
        self.__func()
        print("...After decorate...")

@Test  
def func1():     # 相当于 func1 = Test(func) ,先新建一个Test对象,执行__init__方法,保存原始func1函数引用到对象  
    print("this is a func1")

# 现在func1指向一个Test对象
func1()  # Test.__call__

2. 原函数 没有参数 、装饰器 有参数

代码:

class Test2:
    def __init__(self, num):
        print('__init__')
        self.__num = num
    
    def __call__(self, f):
        print(f"__call__ , num = {self.__num}")
        self.__func = f
        return self.old_func        

    def old_func(self):
        print("...Start decorate...")
        self.__func()
        print("...After decorate...")

# Test2(123)的返回值(一个实例对象)对func2进行装饰
@Test2(123)  # obj = Test2(123) 、func2 = obj(func2)  后者会执行__call__函数,现在func2指向一个Test2对象中的old_func引用
def func2():
    print("this is a func2")

func2() 


如果注释掉上面代码最后一行,会有如下输出:

3. 原函数 有参数 、装饰器 没有参数

代码:

class Test3:
    def __init__(self, f):
        print("__init__")
        self.__func = f
    
    def __call__(self, *args, **kwargs):
        print("__call__")
        print("Start decorating")
        self.__func(*args, **kwargs)
        print("After decorating")
@Test3
def func3(name):
    print(f"this is a {name}")

func3("詹姆斯")

4. 原函数 、装饰器 都有参数

class Test4:
    def __init__(self, LEVEL):
        print('In __init__')
        self.__LEVEL = LEVEL
    
    def __call__(self, f):
        print(f"In __call__ , LEVEL = {self.__LEVEL}")
        def wrapper(*args, **kwargs):
            print("...Start decorate...")
            return f(*args, **kwargs)
        return wrapper


@Test4(LEVEL = 'Warning')
def func4(name):
    print(f"this is a {name}")

func4("wybbb")

标签:__,...,场景,func,Python,self,以类,print,def
From: https://www.cnblogs.com/Higgerw/p/17904725.html

相关文章

  • 基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数
    简介LSTM是一种常用的循环神经网络,其全称为“长短期记忆网络”(LongShort-TermMemoryNetwork)。相较于传统的循环神经网络,LSTM具有更好的长期记忆能力和更强的时间序列建模能力,因此在各种自然语言处理、语音识别、时间序列预测等任务中广泛应用。问题场景:对一节火车进行装载货物,......
  • python操作文件夹
    帮我写一个python程序遍历文件夹下所有的压缩文件,如ziprar7z结尾的文件等等当然可以!以下是一个Python程序,它可以遍历指定文件夹下的所有压缩文件,如zip、rar、7z等等。你可以根据需要修改代码中的路径和文件类型。请注意,这个程序需要安装第三方库patool和pyunpack,你可以使用pip......
  • 使用Python Multiprocessing库提升代码性能
    在现代计算机编程中,利用多核处理器的能力来提高应用程序的执行速度至关重要。Python的multiprocessing库就是为此而生的,它允许程序员创建进程,这些进程可以在多个CPU核心间并行运行,从而提高程序的性能。在这篇技术博客中,我们将探索multiprocessing库的关键概念及其在Python中的应用......
  • Python NumPy 线性代数
    ​ 1、矩阵和向量积矩阵和向量积可以用 numpy.dot() 函数来计算。numpy.dot()函数的两个参数分别是矩阵和向量。1)矩阵积矩阵积是两个矩阵相乘的结果。矩阵积的计算方法是将矩阵的每一行与另一个矩阵的每一列相乘,然后将各个相乘结果相加。示例代码:PythonNumPy线性代数-......
  • python高级之包
    包1、包就是一个含有__init__.py文件的文件夹2、为何要有包?包的本质是模块的一种形,包是用来当作模块被导入#1.产生一个名称空间#2.运行包下__init__.py文件,将运行过程中产生的名字都丢到1的名称空间中。#3.在当前执行文件的名称空间中拿到一个名字mmm,mmm指向1的名称空间im......
  • python高级之软件开发的目录规范
    软件开发的目录规范为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要。软件的目录规范并无硬性标准,只要清晰可读即可,假设你的软件名为foo,笔者推荐目录结构如下Foo/|--core/||--core.py||--api/||--api.py||--db/|......
  • python高级之名称空间和作用域
    名称空间与作用域补充知识栈区/堆区栈区:存放的是变量名与变量值的内存地址映射关系堆区:存放的是值真正的位置名称空间引入:1.什么是名称空间?-名称:定义的名字空间:存放名字的地方-名称空间即存放名字与对象映射/绑定关系的地方。-名称空间只是虚拟的概念......
  • python高级之函数对象与闭包函数
    函数对象和闭包函数函数对象1,什么是函数对象?函数对象简单理解就是将函数当变量来使用。如下图所示:定义一个函数可以简单的理解为:func=函数体内存地址函数名+()–>调用函数函数名-->函数对象,函数名不加括号此时的函数名就是函数对象函数用于赋值将函数赋值给某个变......
  • Python OpenCV的下载和安装
    为了更快速地、更简单地下载和安装PythonOpenCV,本书将从清华镜像下载和安装OpenCV-Contrib-Python库。在这个库中,除包括OpenCV-Contrib-Python库外,还包括Numpy库。Numpy库是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算。1 下载和安装OpenCV-Contrib-Python库从......
  • 【python基础之三元表达式】--- 三元表达式
    title:【python基础之三元表达式】---三元表达式date:2023-12-1519:34:06updated:2023-12-1519:34:00description:【python基础之三元表达式】---三元表达式cover: https://blog.csdn.net/qq_42076902/article/details/131226900三元表达式Python的三元表......