2013-03-02 21 views
0

我希望標題不會太錯誤或者誤導;我不完全確定這個名字是什麼名字。在返回之前在子類的構造函數中包裝實例

基本上,我已經做了很多工作,使用詞典(和一些亞類的化合物:defaultdictOrderedDict,例如),我試圖只是做一些輔助功能,這會做一些這方面解除對我來說,同時仍在跨越多種不同類型的詞典進行操作。理想情況下,我想快速做到這一點(即,進行一定程度的優化),當然優雅。這裏是什麼,我現在有一個例子:

def filter_dict(old_dict, keep_keys): 
    return {k:v for k,v in old_dict.items() if k in keep_keys} 

這種運作良好,但如果old_dict比基本詞典其他任何東西,我失去的。

好了,所以我可以這樣做type(old_dict)({.....})包裹在old_dict的類的構造函數中新創建的字典,但仍然沒有爲defaultdicts,內搭作爲第一個參數函數返回默認值工作。如果它是第二個參數,我可以通過一些*args或某些東西給構造函數,但這使事情變得複雜。

我想我的問題是:我可以得到一個部分應用程序的構造函數?我可以得到這個實例的膽量,並且除了items之外的所有東西都可以調用它的類構造函數嗎?在Haskell中,我會做類似reverse = lambda f, x, *args: f(*args, x)的東西,但在Python中甚至不允許這樣做。

我錯過了什麼?對類的一些反思?修改__new__?工廠...還有什麼呢?我覺得這很愚蠢,試圖讓一些漂亮但有用的東西(har)。

在此先感謝您的任何見解。

回答

0

我想複製原始對象,然後更改副本。在您的例子:

def filter_dict(old_dict, keep_keys): 
    res = old_dict.copy() 
    for k in res.keys(): 
     if k not in keep_keys: 
      res.pop(k) 
    return res 

這聽起來像您的輔助功能只知道他們想在old_dict改變,不是他們想保持相同的東西的事情。所以,最安全的方式似乎是依靠copy方法(或copy模塊),然後刪除或更改不需要的內容。否則,您需要一些方法來準確回顧用於創建對象的參數,並且我不知道是否存在執行此操作的一般方法。

+0

是的,我已經明確地考慮過這一點,但它看起來確實......殘酷?我絕對認爲這是一個很好的學習機會,因爲我一直在嘗試進行自省,課堂布局等。 如果一切都失敗了,我可以直接返回del k的深層拷貝,如果k不在keep_keys或一些這樣的。感謝您的迴應。 – 2013-03-02 07:35:21

+0

我理解你對優雅的渴望,但我會提醒你不要爲了清晰和/或功能而爲了自己的目的而進行面向對象的設計。複製構造函數幾乎完全符合你的要求 - 用與前一個數據相同的數據初始化一個新對象。就我個人而言,我發現__new__等人使用細微技巧的代碼很難閱讀,儘管有時這是必要的。 – cxrodgers 2013-03-06 07:22:25

相關問題