Search code examples
pythonpartialfunctools

python equivalent of functools 'partial' for a class / constructor


I want to create a class that behaves like collections.defaultdict, without having the usage code specify the factory. EG: instead of

class Config(collections.defaultdict):
    pass

this:

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

This almost works, but

isinstance(Config(), Config)

fails. I am betting this clue means there are more devious problems deeper in also. So is there a way to actually achieve this?

I also tried:

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

Solution

  • I don't think there's a standard method to do it, but if you need it often, you can just put together your own small function:

    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)