在返回之前将实例包装在子类的构造函数中

时间:2013-03-02 00:13:47

标签: python class constructor factory partial

我希望标题不是太错误或误导;我不完全确定这个名字是什么名字。

基本上,我一直在用词典(以及它的一些子类,例如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__?工厂......还有什么东西?我觉得这里真的很蠢,试图得到一些漂亮但功能强大的东西。

提前感谢任何见解。

1 个答案:

答案 0 :(得分: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模块),然后删除或更改您不想要的内容。否则,您需要某种方式来准确回忆用于创建对象的参数,并且我不知道是否存在执行此操作的常规方法。