2016-08-12 38 views
3

我想創建一個行爲與collections.defaultdict類似的類,但沒有使用代碼指定工廠。 EG:的 代替對於類/構造函數,functools'partial'的python等效

class Config(collections.defaultdict): 
    pass 

這樣的:

Config = functools.partial(collections.defaultdict, list) 

這幾乎工作,但

isinstance(Config(), Config) 

失敗。我敢打賭,這個線索意味着更深層次的更狡猾的問題。那麼有沒有辦法實現這個目標?

我也試過:

class Config(Object): 
    __init__ = functools.partial(collections.defaultdict, list) 
+0

會不會更合理的檢查是:'isinstance(Config(),collections.defaultdict)'?只要'Config'不是一個類,'isinstance'當然會失敗。由於顯式類型檢查在Python中並不常見/推薦,所以您可能會繼續使用上面的'Config' - 它應該在許多情況下以滿意的方式工作。 – sebastian

回答

5

我不認爲有這樣做的標準方法,但如果你需要它的時候,你可以整理了一下自己的小功能:

import functools 
import collections 


def partialclass(cls, *args, **kwds): 

    class NewCls(cls): 
     __init__ = functools.partialmethod(cls.__init__, *args, **kwds) 

    return NewCls 


if __name__ == '__main__': 
    Config = partialclass(collections.defaultdict, list) 
    assert isinstance(Config(), Config) 
2

如果你確實需要通過isinstance工作明確的類型檢查,你可以簡單地創建一個不過於瑣碎的子類:

class Config(collections.defaultdict): 

    def __init__(self): # no arguments here 
     # call the defaultdict init with the list factory 
     super(Config, self).__init__(list) 

你必須無參構造與錶廠和

isinstance(Config(), Config) 

也能發揮作用。