2012-06-03 31 views
4

我嘗試了幾種方法來改變定義中的函數名稱,但是失敗了。可能在定義中更改函數名稱?

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

任何方式來改變/設置它的定義(除了使用裝飾)?

+1

「self .__ method __()」不起作用的原因是因爲'self'是從解釋器傳遞給參數的參數。沒有機制將實例傳遞給你的函數。 (順便說一句,變量名不一定是'self',它可以是'foo'或'bar'或其他) –

+2

您是否正在編寫用於工作安全性的代碼? :) –

回答

8

在執行該功能之前,函數體不會被執行。你可以儘管使用裝飾:

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

,然後用它是這樣的:

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

然而,該功能目前還只能作爲可達f

3

不可以。您可以最接近的是定義一個可調用類,每個實例在初始化程序中設置其__name__

3

在調用函數之前函數體不會被執行,所以您無法使用函數體來改變定義時發生的事情。無論如何,你爲什麼要這麼做?如果您正在編寫函數並希望它具有不同的名稱,只需使用不同的名稱來定義它。

+0

我原本想要它,因爲我認爲我需要它(使一個函數返回一個名稱基於外部函數參數的函數)。然後我意識到我不需要在內部函數定義中完成它,但仍然很好奇。 – beardc

0

如果你把它放在函數體中,你說的執行的一部分f正在設置它的名字爲'new name'。很顯然,在函數被調用之前不會做任何事情。

使用裝飾規範的方式來聲明一個函數有點不同於它的def塊單獨會表明,你不會找到更好的。

0

這可能是愚蠢的,但有點作品?

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


>>> new_name() 
>>> f 
<function new_name at 0x01945108> 
>>> f.__name__ 
'new_name' 
+0

這確實不是很好。您正在通過變量名稱來尋址函數,但希望它仍然存儲在該函數中,但在調用該函數時,它可能已經存儲在某些函數數組中,並且可能會刪除全局變量f或重新用於別的東西。 – Alexey

相關問題