2013-04-30 58 views
2

通常的描述符用在類屬性,像這樣:Python的描述符(__get__,__set__)上功能參數

class Owner(object): 
    attr = Attr() 

當越來越Owner.attrAttr.__get__(self, instance, owner)被稱爲其中self = Owner.attrinstance = Noneowner = Owner

Owner被實例化時instance將是Owner的實例。

現在我想將這個概念應用於方法參數而不是類屬性。

會如何看待在實踐中(我們假設的Attr功能是包裝一個字符串給定的字符串):

class Example(object): 
    def funct(self, param=Attr('t')): 
     return param == 'test' # < param calls the descriptor here 

e = Example() 
e.funct('es') # < is True because 'es' wrapped with 't' becomes 'test'. 

當訪問paramAttr.__get__(self, instance, owner)將與self = funct.paraminstance = functowner = funct被稱爲(儘管ownerinstance是一樣的,可能是None?)。 但由於funct不是一個類,所以這不起作用。我如何得到類似於工作的東西?

該函數的裝飾器將處理參數,所以這可能會增加我認爲的解決方案。 裝飾者必須是,例如,能夠改變包裝字符串。

+1

你可以添加一個使用場景來顯示如何訪問'param'? – unutbu 2013-04-30 13:07:13

+0

這個功能的目的是什麼?你是否試圖將狀態附加到函數中?你是否試圖通過參數動態定義函數的行爲?你是否試圖推遲一些依賴的解析,直到函數被執行? – 2013-04-30 13:22:27

+0

@unutbu我已經添加了一個用例,我認爲更適合。你覺得現在更清楚了嗎? – siebz0r 2013-04-30 13:31:23

回答

2

函數實際上是Python中的第一類對象,但是您說所描述的語法不會按需要工作時是正確的。您可以使用裝飾器來做這樣的事情,該裝飾器會檢查傳遞的屬性,以便啓用這種功能。然而,你可能會更好地實現可調用對象,然後將描述符附加到該對象上,並創建可調用對象而不是函數的實例。

+0

我選擇了另一種解決問題的方法。但是這種方法將起作用。我的裝飾器保存裝飾對象的'簽名',對於一個函數,可以通過創建一個帶有描述符屬性的可調用類並將函數包裝在'__call__'方法中來實現。然後可以將原始函數的argspec複製到'__call__'方法中。 NICE!注意:這是一個需要使用函數/方法的地方,一個普通的可調用類不夠用,但是用裝飾器它應該是可能的。 – siebz0r 2013-05-01 11:53:58