首页 > 编程语言 >Python 装饰器之__call__()

Python 装饰器之__call__()

时间:2024-09-10 16:16:38浏览次数:7  
标签:__ Python self add call time print

已知我们可以用装饰器模式去实现切面功能,啊你不知,那么请看python装饰器模式实现切面功能

除此之外还有其他方式去实现切面功能吗?当然有,那就是python的__call__()方法,call()是一个特殊方法,用于将一个类实例变成一个可调用的对象,即可以像函数一样调用这个类。当调用一个类实例时,Python会自动调用该实例的call()方法。

语法介绍

def __call__(self, *args, **kwargs):
    pass
# *args:可变位置参数,可以接收任意数量的位置参数。
# **kwargs:可变关键字参数,可以接收任意数量的关键字参数。

应用场景

  1. 创建可调用对象:使得对象可以像函数一样被调用。
  2. 封装逻辑:将某些逻辑封装在对象中,并通过调用对象来执行。
  3. 实现函数式编程风格:在面向对象的编程中引入函数式编程的特性。

先举个栗子

class Add(object):
    def __init__(self, x):
        self.x = x

    def __call__(self, y):
        return self.x + y


add3 = Add(3)
print(add3(3))  # 输出6
print(add3(7))  # 输出10

重点来了,敲黑板!!!装饰器模式实现

import time


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

    def __call__(self, *args, **kwargs):
        print(f"entry {self.func.__name__} method")
        start_time = time.time()
        result = self.func(*args, **kwargs)
        end_time = time.time()
        print(f'end {self.func.__name__} method cost {end_time - start_time}')
        return result


@Decoration
def add(x: int, y: int):
    time.sleep(x)
    return x + y


print(add(1, 2))
print(add(5, 2))

输出

entry add
end add method cost 1.0084202289581299
3
entry add
end add method cost 5.009873628616333
7

在上面的例子中,我们定义了一个名为Decoration的类,该类接收一个函数作为参数。call()方法则对该函数进行包装,计算其执行时间,并返回执行结果。然后我们使用@Decoration装饰器将add()函数进行包装,对add方法做了函数,并没有入侵add函数。

标签:__,Python,self,add,call,time,print
From: https://www.cnblogs.com/lyuSky/p/18406596

相关文章

  • 利用CesiumEarth快速制作GIS三维演示场景
    CesiumEarth是一款快速展示地理信息图层的工具,无需做二次开发,即可傻瓜式的把地理信息图层叠加展示出来,方便做一些汇报和教学CesiumEarth只是一款工具,展示的图层数据需要自己准备,下面用一个简单的例子作为引用:话不多说,先上访问链接:​CesiumEarth官网一、数据准备:1、底图:目前可......
  • saber2016安装教程
    saber2016安装教程-知乎(zhihu.com)第一步:保证解压时某些应用程序不会被系统当作病毒自动删除。①下载安装包②断网;③关闭防火墙;④关闭windows安全中心—病毒和威胁防护—实时保护。解压文件包。“Saber_L-2016.03”用以安装;“license”文件夹用以破解。注意如果防......
  • C. To Become Max
     原题链接题解显然采用二分答案,下面讲解check函数怎么写。观察到n的属于1000以内,所以我们的check函数可以采用平方的复杂度。我们采取枚举法,假定ai可以达到我们的理想值,那么我们只需要从i位置开始考虑k怎么分配即可。code #include<bits/stdc++.h>usingnam......
  • [Python手撕]螺旋数组
    classSolution:defspiralOrder(self,matrix:List[List[int]])->List[int]:res=[]left=0right=len(matrix[0])-1down=len(matrix)-1up=0whileleft<=rightandup<=down:......
  • gunicorn 日志设置
    命令行模式gunicorn-w4-b0.0.0.0:8000--access-logfileaccess.log--error-logfileerror.loglogleveldebug配置文件gunicorn.conf#gunicorn.conf#并行工作进程数workers=4#指定每个工作者的线程数threads=2#监听内网端口5000bind='127.0.0.1:5000......
  • 高等数学 1.4无穷小与无穷大
    目录一、无穷小二、无穷大一、无穷小定义:如果函数\(f(x)\)当\(x\tox_0\)(或\(x\to\infty\))时的极限为零,那么称函数\(f(x)\)为当\(x\tox_0\)(或\(x\to\infty\))时的无穷小.特别地,以零为极限的数列\(\{x_n\}\)称为\(n\to\infty\)时的无穷小。注意:不要把......
  • 红黑树的实现
    上一篇中我们讲述了红黑树的插入,以及删除时需要进行的各种调整的情况,根据这些情况,我们可以用代码实现红黑树的插入与删除操作.节点的定义一颗红黑树的定义如下://定义颜色枚举类型enumColor{RED,BLACK};template<classT>structRed_Black_Node{Red_Bla......
  • 搭建企业内部的大语言模型系统
    大纲开源大语言模型大语言模型管理私有大语言模型服务部署方案开源大语言模型担心安全与隐私?可私有部署的开源大模型商业大模型,不支持私有部署ChatGPTClaudeGoogleGemini百度问心一言开源大模型,支持私有部署MistralMetaLlamaChatGLM阿里通义千问常......
  • 115. 不同的子序列(leetcode)
    https://leetcode.cn/problems/distinct-subsequences/submissions/563375885/这题比较有难度,具体不太好想到,需要以是否选择s[i]来划分子集这位描述的很清楚,不做过多赘述classSolution{publicintnumDistinct(Strings,Stringt){//f[i][j]表示s中前i个......
  • Linux中PATH、 LIBRARY_PATH、 LD_LIBRARY_PATH的区别
    Linux中PATH、LIBRARY_PATH、LD_LIBRARY_PATH的区别_pathlibrary-CSDN博客这里写目录标题1.PATH2.LIBRARY_PATH3.LD_LIBRARY_PATH1.PATHPATH是可执行文件路径命令行中的命令,如ls等等,都是系统通过PATH找到了这个命令执行文件的所在位置,再run这个命令(可执行文件)。所以,PATH......