首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

函数装饰器封装后,如何获取函数的原始名称?

函数装饰器是Python中一种用于修改、扩展或包装函数的技术。在装饰器封装后,获取函数的原始名称可以通过使用functools.wraps装饰器来实现。

functools.wraps是Python标准库中的一个装饰器,它用于将被装饰函数的元信息(如函数名、参数列表、文档字符串等)复制到装饰器函数中,从而保留原始函数的属性。

下面是一个示例代码,展示了如何使用functools.wraps装饰器获取函数的原始名称:

代码语言:python
复制
import functools

def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("Original function name:", func.__name__)
        return func(*args, **kwargs)
    return wrapper

@decorator
def my_function():
    pass

my_function()

在上述代码中,decorator是一个装饰器函数,它使用functools.wraps装饰器来封装被装饰函数my_function。在wrapper函数中,我们可以通过func.__name__来获取原始函数的名称,并打印输出。

运行上述代码,输出结果为:

代码语言:txt
复制
Original function name: my_function

通过这种方式,我们可以在装饰器中获取函数的原始名称,并进行相应的处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python基础语法-函数-函数装饰-带参数装饰

带参数装饰装饰可以接受参数,这意味着我们可以在运行时指定一些配置选项。...say_hello()在这个例子中,我们定义了一个名为“decorator_function”装饰函数,它接受一个消息作为参数并返回一个包装函数。...但是,这次我们定义了一个内部函数“inner_wrapper”,该函数将在被装饰函数执行之前和之后执行一些操作。然后,我们将带有参数装饰应用于我们“say_hello”函数。...作为参数传递给装饰函数,并将结果分配给“say_hello”函数,这意味着我们将“say_hello”函数传递给“decorator_function”函数作为第二个参数,并将“Hello World...最后,我们调用“say_hello”函数,它将在执行前和执行打印一条消息,包括我们传递给装饰函数消息。

1K30

装饰函数构造

装饰分为无参装饰和有参装饰装饰实现都是通过“函数嵌套+闭包+函数对象”组合生成。...return 100 # 这时候调用方式 index() # 调用函数,但是这时候调用函数就不再是原先index函数了,而是加了装饰index函数 使用装饰之后...,调用方式没有发生任何改变,同时也实现了附加功能;同时如果还有其他函数想要实现这个种附加功能也这需要添加一个装饰就可以了。...有参装饰实现 由于语法糖 @ 限制,outter函数只能有一个参数,并且这才是只用来接受被装饰对象内存地址 # 定义一个验证功能装饰 def auth(driver): # 最高层传递参数...,但是还存在一个问题,就是虽然有参装饰是实现了,并且调用方式都没发生任何变化,但是还有一个问题,那就是函数属性以及一些其他附加内容,并没有进行修改,这时候其实需要把他们全部进行修改才是一个完美的装饰

36930

函数衣服--装饰

,外层函数返回值是内层函数装饰返回值也是一个函数对象。...装饰作用顾名思义,就是装饰其他函数,为其他函数增加额外功能,有了装饰,我们就可以抽出大量与函数功能本身无关代码复用。...特殊语法: 语法糖--- @语法 @装饰外层函数名 def 原始函数(): pass 我们可以把原始函数看成裸露肉体,装饰就是为原始函数加上了外衣,这层外衣为原本肉体增加了遮羞打扮功能...▉一个函数可以添加一个或多个装饰 ▉多个函数也可以使用同一个装饰 ▉对带参函数进行修饰 def use_decorate(func): def cop_time(x,y):...▉总结: 使用装饰: 需要为核心代码添加功能 但是又不想修改核心代码内容 就可以添加装饰

63120

Python基础语法-函数-函数装饰-带参数装饰

带参数装饰装饰还可以带参数。...例如,下面是一个带参数装饰示例:class DecoratorClass: def __init__(self, message): self.message = message...然后,我们定义了一个名为“call”特殊方法,它接受一个函数作为参数,并返回一个包装函数。然后,我们将带有参数装饰应用于我们“say_hello”函数。我们将“Hello World!”...作为参数传递给装饰类,并将结果分配给“say_hello”函数,这意味着我们将“say_hello”函数传递给“DecoratorClass”实例“call”方法作为参数,并将“Hello World...最后,我们调用“say_hello”函数,它将在执行前和执行打印两条消息,分别是装饰前置和后置消息,包括我们传递给装饰消息,以及我们原始函数输出。

1.2K20

一日一技:装饰如何装饰异步函数

在 Python 开发工程中,我们常常使用装饰来优化代码,例如一个打印日志装饰: import requests import datetime def time_log(func):...但如果get是一个异步函数,这个装饰就会出问题: import pprint import aiohttp import datetime import asyncio def time_log(...这并不是我们需要实现效果。我们想要是先打印前一行,然后请求网络,再打印一行。...为了解决这个问题,我们需要把time_log装饰wrap也定义成异步函数: def time_log(func): async def wrap(*args, **kwargs):...这样就能保证代码执行顺序: ? 但需要注意是,装饰本身是一个同步函数,不需要使用async def来定义。只有里面的闭包需要定义为异步函数

3.4K21

函数装饰,两层装饰和三层装饰

06.01自我总结 一.装饰 1.函数装饰定义 函数装饰:一种装饰函数函数 2.个人理解两层函数装饰 两层函数装饰个人觉得他其实就是把需要装饰函数名丢入形参,然后用一个嵌套函数对其头尾进行添加程序...,但是不能减少他程序内容,他原来程序不变只能增不能减少,然后返回装饰函数,再全局定义一个变量名与要装饰函数名相同名字,并且将装饰函数调用赋予改变量. 1.简单例子(无参函数) 如 #有个函数...) return sum sum() = sum_deco(sum) sum(x,y) #多个值 def sb(x,y,z=2,b=1): print(x,y,z,b) #把他进行封装...def sb(*args,**kwargs): pass #装饰模板 def sb_deco(sb): def wrapper(*args,**kwargs): #sb...return wrapper sb = sb_deco(sb) sb(1,23,2,3,12,312,312,3,123) 3.对于三层装饰理解 #比如说一个函数为,我们对齐装饰,打印内容前后上下加'

74010

装饰(让你函数更强)

此时我们写了一个最简单函数出来.我们做到装饰本意就是在不改变源代码样子就能加强它功能,假如我们想增强上面的函数功能,希望在返回函数时候,不是孤孤单单就返回一个字符串,想给他加一个HTML...像上面这些情况,可以动态修改函数(类)功能函数就是一个装饰.本质上是一个高阶函数,以被装饰函数作为参数,返回一个包装函数....@wrap_in_tag('b') def hello(name): return 'hello %s' % name 其实就是再装饰外面加了一层包装,根据不同参数返回不同装饰 多个装饰...装饰副作用 注意使用装饰有个毛病,就是被装饰函数,它函数名称已经不是原来名称了.为了消除这个毛病,让我们来这样做: from functools import wraps def makeitalic...__name__ 小结 1.本质上,装饰就是iyge返回函数高阶函数 2.可以动态修改类以及函数功能,通过再原有的类上面包裹函数完成 3.其实,装饰是闭包一种应用,区别是装饰一定会返回一个函数

41720

Python入门之函数装饰

引子--为什么要用装饰   软件一旦上线,对修改源代码是封闭,对功能扩展是开放。   ...outter(index),被''装饰''了 index() # 该方法能显示运行时长, 是把最初始index函数通过闭包特点,经过处理重新把新函数内存地址,赋值给了index,后面的index...# 注意语法糖放置位置,放在要用函数顶部,要用@开头 ? 五、认证装饰实现   1. 加入认证模块简单实现: ?  2. 加入认证模块登陆进行验证: ?...新增参数为装饰编写和使用提供了更大灵活性。 ? 上面的use_logging是允许带参数装饰。它实际上是对原有装饰 一个函数封装,并返回一个装饰。...我们可以将它理解为一个含有参数闭包。 当我们调用时候,Python能够发现这一层封装,并把参数传递到装饰环境中。

80770

为什么 Python 没有函数重载?如何装饰实现函数重载?

在这里,我们会使用 Python 装饰。 在 Python 中,装饰器用于封装一个函数,并允许我们在不修改该函数结构情况下,向其添加新功能。...装饰把被装饰函数 fn 作为参数,并返回一个新函数,用于实际调用。新函数会接收原始函数 args 和 kwargs,并返回最终值。...以下是一个装饰示例,演示了如何函数添加计时功能。...每当解释遇到一个函数定义时,就会调用装饰函数 my_decorator(用它封装装饰函数,并将封装函数存储在 Python 局部或全局命名空间中),对于我们来说,它是在虚拟命名空间中注册函数理想钩子...运用函数重载 准备好所有代码,我们定义了两个名为 area 函数:一个计算矩形面积,另一个计算圆面积。下面定义了两个函数,并使用overload装饰进行装饰

2.8K10

python3--函数有用信息,带参数装饰,多个装饰装饰同一个函数

例2 使用装饰打印出函数相关信息 from functools import wraps def deco(f):       @wraps(f)  # 加在最内层函数正上方     def wrapper...,要求功能是:用户传入一个url,函数返回下载页面的结果(升级题) 5.1.为题目3编写装饰,实现缓存网页内容功能:(升级题) 具体:实现下载页面存放于文件中,如果网页有对应缓存文件,就优先从文件中读取网页内容..., 功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log日志中。...@wrapper def comment():     print('北美专区......') article() diary() file() comment() 8,在编写装饰,为多个函数加上认证功能...供用户选择,用户输入选项,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。 相关提示:用带参数装饰装饰内部加入判断,验证不同账户密码。

3.1K10

关于Python函数装饰最简单说明

导读 本文是关于Python函数装饰最简单介绍,没有废话,没有套路,赤裸裸一句话就掌握Python函数装饰。...你会想着,什么鬼函数装饰,到底该怎么装饰啊? 实际上关于函数装饰,只要一句话:函数装饰就是函数替换过程——被装饰函数被替换成另一个东西。 那么问题来了,什么样函数能作为装饰函数呢?...注意 此处出现了两个概念,后文要仔细区分: 装饰函数:用于修饰其他函数东西。就是@符号后面的东西。 被装饰函数,就是被@装饰修饰函数。...装饰函数为什么要参数 正如前面所说装饰函数几乎没有要求,只要带一个形参! 那么系列问题就来了: 装饰函数参数为什么是一个?不是两个? 这个形参有什么用? 装饰函数什么时候调用?...因此上面程序中装饰函数foo()中第二行输出x参数,输出就是被装饰bar()函数装饰函数参数为什么是一个?不是两个?

75020

修改其他函数功能神器——python装饰

1.函数装饰介绍 装饰(Decorators)是 Python 一个重要部分。简单地说:他们是修改其他函数功能函数。他们有助于让我们代码更简短,也更Pythonic(Python范儿)。...所谓“语法糖”指的是编程语言中对功能没有影响但是能显著提高易用性和可读性特殊语法,本文要谈到装饰”是python最重要语法糖,没有之一。...当需要对已有的函数添加额外功能时: 个人程序-直接修改代码 函数封装-创建新封装函数 装饰处理 2.个人程序 #对已有的函数添加额外功能 #比如为整个程序添加个计时功能 import random...还有一种解决方案,就是将原函数封装到一个新函数中, 在新函数中对原函数运行时间进行计算。...使用该方案 不仅需要为每一个需要功能拓展函数分别新建一个新函数, 而且还要修改所有的调用, 如果需要功能拓展函数有成百上千个,可想而知会带来多大工作量。 如何简洁优雅地实现函数功能拓展呢?

51150
领券