10

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

>>> def f():
        pass
>>> f.__name__
'f'
>>> def f():
        f.__name__ = 'new name'
>>> f.__name__
'f'
>>> def f():
        self.__name__ = 'new name'
>>> f.__name__
'f'

但是我可以在定义后更改名称属性。

>>> def f():
        pass
>>> f.__name__ = 'new name'
>>> f.__name__
'new name'

有什么方法可以在定义中更改/设置它(除了使用装饰器)?

4

5 回答 5

26

在您执行函数之前,不会执行函数体。你可以使用装饰器:

def rename(newname):
    def decorator(f):
        f.__name__ = newname
        return f
    return decorator

然后像这样使用它:

@rename('new name')
def f():
    pass
print f.__name__

但是,该功能仍然只能作为f.

于 2012-06-03T22:35:53.800 回答
3

不。最接近这一点的是定义一个可调用类,每个实例都__name__在初始化程序中设置了它的集合。

于 2012-06-03T22:31:08.793 回答
2

在调用函数之前,函数体不会执行,因此您无法使用函数体来更改定义时发生的情况。你为什么要这样做呢?如果您正在编写函数并希望它具有不同的名称,只需使用不同的名称定义它。

于 2012-06-03T22:32:02.360 回答
0

如果你把它放在函数体中,你说的是执行的一部分是把f它的名字设置为'new name'. 显然,在调用函数之前,这不会做任何事情。

使用装饰器声明函数与def单独的块稍有不同的规范方式,并且您不会找到更好的方法。

于 2012-06-03T22:44:00.763 回答
0

这可能很愚蠢,但有点工作?

>>> f = None
>>> def new_name():
    global f
    f = new_name


>>> new_name()
>>> f
<function new_name at 0x01945108>
>>> f.__name__
'new_name'
于 2012-06-03T22:53:53.667 回答