在Python中,__name__
是一个特殊的内置属性,用于返回当前模块的名字。当你在函数内部使用 __name__
时,它会返回当前函数的名称。然而,当你使用装饰器时,情况会有所不同。
装饰器本质上是一个函数,它接受另一个函数作为参数,并返回一个新的函数。装饰器通常用于在不修改原函数代码的情况下,增加额外的功能。
当你在一个被装饰的函数中使用 __name__
时,由于装饰器返回了一个新的函数,所以 __name__
实际上返回的是这个新函数的名称,而不是原函数的名称。
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!")
print(say_hello.__name__) # 输出: wrapper
为了获取原函数的名称,可以使用 functools.wraps
装饰器。functools.wraps
是一个装饰器,用于更新被装饰函数的一些属性,包括 __name__
、__doc__
和 __module__
。
import functools
def my_decorator(func):
@functools.wraps(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!")
print(say_hello.__name__) # 输出: say_hello
通过使用 functools.wraps
,你可以确保 __name__
返回的是原函数的名称,而不是装饰器返回的新函数的名称。
领取专属 10元无门槛券
手把手带您无忧上云