使用闭包实例化新对象

时间:2019-06-30 14:45:01

标签: python closures

我试图了解我在做的事情是否有意义/是否是一个好的模式。

Filter是一个可调用的类,旨在过滤其他一些类(Dataview),并在调用时返回一个经过过滤的新的dataview对象。

在Filter中自然有一个属性,它是特定过滤器(filter.funct)的实际功能

我希望能够创建这样的过滤器:

filterc = filterb&filtera

所以我的Filter类中有以下代码:

def __and__(self, other):
    assert isinstance(other, Filter),"And(Logical operation) between Filters supports only another Filter,got {}".format(type(other))
    def new_funct(dataview):
        return self(dataview)&other(dataview)
    return Filter(funct=new_funct,str_representation=repr(self)+'&'+repr(other))

如您所见,我正在创建一个新的Filter对象,该对象具有我正在做的一些内部函数,希望它是一个闭包(例如,某种程度上保存了它的环境)。

在代码本身可以正常工作的同时,我想知道这是否有意义以及我是否在做某些天生的错误。

1 个答案:

答案 0 :(得分:1)

这种方法没有什么问题:它避免为每种“化合物” Filter创建单独的类。但是,可能会期望使用lambda:

return Filter(lambda x: self(x)&other(x),…)

那只是语法:它以selfother两种方式关闭。