可以在定义中更改函数名称吗?

时间:2012-06-03 22:28:31

标签: python function attributes

我尝试了几种方法来更改定义中的函数名称,但它们都失败了。

>>> 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'

在定义中更改/设置它的任何方法(除了使用装饰器)?

5 个答案:

答案 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'