2014-10-01 58 views
1

我有一段代碼,其中我拉函數出字典的,然後添加對象屬性給它。但是,我有一些問題從函數內部訪問它,大概是由於命名空間。將屬性分配給特定功能實例

aFunction = FunctionsDictionary[key] 
aFunction.someObject = someObject 
aFunction() 

def aFunction(): 
    someObject.doSomething() 

給人NameError global name 'someObject' is not defined.

如果我做一個目錄(機能缺失)後,我設置),從內部功能不顯示屬性的屬性,我可以看到它,但是一個目錄(。

雖然我可能更改代碼有函數接受對象作爲參數,我怎麼把這些屬性的功能的「實例」設置?

下面是另一個例子:

def myFunc(): 
    print coolAttr 

func = myFunc 
func.coolAttr = "Cool Attribute" 
func() 
NameError: global name 'coolAttr' not defined 

回答

1

它似乎並不像有一個(好)的方式來獲得在Python當前運行的函數的引用;見Is there a generic way for a function to reference itself?Python code to get current function into a variable?。在您的所有功能與使用def名稱定義的情況下,你可以只參照功能通過其名稱(例如aFunction在你的例子)的函數體中獲取其屬性。

更大的問題是,這可能沒有你想要的效果...函數在python中通過引用傳遞,因此如果aFunctiondict中多次出現,函數對象仍然只有一個副本。因此,如果您將屬性設置爲dict的多個值,所有這些都指向相同的功能,則最終只會存儲該屬性的最後一個值......如果這就是您需要。

最好的答案很可能是這樣的相關值作爲參數傳遞給重寫代碼。

+0

一般而言,似乎不喜歡你可以在運行時將屬性添加到函數引用(即一個裝飾的外部施加到功能的定義)。如果在給它分配屬性後打印函數實例,然後在函數中打印自己,它們不是同一個對象(不同的內存地址)。我覺得這很混亂。我從字典中創建函數的一個實例,對其進行修改,但是當它運行時,它不是同一個對象。 – taylormade201 2014-10-01 16:22:24

+0

在一個隨機函數體內,'self'不指向當前正在執行的函數。 'self'只在明確給出類方法的第一個參數時才被定義;它不是關鍵字。見例如http://stackoverflow.com/a/2709832/4091874和https://docs.python.org/2/tutorial/classes.html#random-remarks。 – caseygrun 2014-10-01 17:39:18

+0

對不起,我的評論,我寫結合功能的裝飾: '高清綁定(FUNC): 回報FUNC .__得到__(FUNC,類型(FUNC))' – taylormade201 2014-10-01 17:53:29

相關問題