我尝试了几种方法来更改定义中的函数名称,但它们都失败了。
>>> def f():
pass
>>> f.__name__
'f'
>>> def f():
f.__name__ = 'new name'
>>> f.__name__
'f'
>>> def f():
self.__name__ = 'new name'
>>> f.__name__
'f'
但我可以在定义之后更改name属性。
>>> def f():
pass
>>> f.__name__ = 'new name'
>>> f.__name__
'new name'
在定义中更改/设置它的任何方法(除了使用装饰器)?
答案 0 :(得分:14)
在执行该功能之前,不会执行函数体。你可以使用装饰器:
def rename(newname):
def decorator(f):
f.__name__ = newname
return f
return decorator
然后像这样使用它:
@rename('new name')
def f():
pass
print f.__name__
但是,该功能仍然只能作为f
。
答案 1 :(得分:3)
没有。你可以得到的最接近的是定义一个可调用的类,每个实例在初始化器中设置了__name__
。
答案 2 :(得分:3)
在调用函数之前不会执行函数体,因此您无法使用函数体来改变定义时发生的情况。你为什么要这样做呢?如果您正在编写该函数并希望它具有不同的名称,请使用其他名称对其进行定义。
答案 3 :(得分:0)
如果您将其放在功能正文中,则表示f
的执行部分正在将其名称设置为'new name'
。显然,在调用函数之前不会做任何事情。
使用装饰器是规范方法来声明一个函数与单独的def
块有点不同,并且你不会找到更好的东西。< / p>
答案 4 :(得分:0)
这可能很愚蠢但有点有用吗?
>>> f = None
>>> def new_name():
global f
f = new_name
>>> new_name()
>>> f
<function new_name at 0x01945108>
>>> f.__name__
'new_name'