2016-08-12 58 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) 

也能发挥作用。