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

も同様に動作します。

関連する問題