Python 是否可以更改定义中的函数名?

Python 是否可以更改定义中的函数名?,python,function,attributes,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__

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

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

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

否。最接近于此的方法是定义一个可调用类,每个实例在初始值设定项中都设置了它的
\uuuuuuuuuuuuu

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

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

def rename(newname):
    def decorator(f):
        f.__name__ = newname
        return f
    return decorator
然后像这样使用它:

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

但是,函数仍然只能在
f

时访问,如果将其放在函数体中,则表示
f
执行部分将其名称设置为
“新名称”
。显然,在调用函数之前,这不会做任何事情


使用decorator一种规范的方法,它可以声明一个函数与其
def
块有点不同,并且你不会找到更好的方法。

这可能很愚蠢,但有点可行

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


>>> new_name()
>>> f
<function new_name at 0x01945108>
>>> f.__name__
'new_name'
>>f=None
>>>def new_name():
全局f
f=新名称
>>>新名称()
>>>f
>>>f.(姓名)__
“新名称”

self.\uu方法(无效的原因是
self
是从解释器传递给参数的参数。没有将实例传递给函数的机制。(顺便说一句,变量名不必是
self
,它可以是
foo
,或
bar
或其他)您编写此代码是为了工作安全吗?:)这并不能回答您的问题,但我认为您会发现它很有趣,因为它解释了函数引用的一些“名称”:我最初想要它,因为我认为我需要它(创建一个函数,返回一个基于外部函数参数的函数名)。然后我意识到我不需要在内部函数定义中这样做,但无论如何我还是很好奇。这确实不太好。您通过变量名对函数进行寻址,希望它仍然存储在变量名中,但在调用函数时,它可能已经存储在某些函数数组中,全局变量
f
可能会被删除或重新用于其他用途。