python中类的Lambda函数?

2024-06-30 16:00:13 发布

您现在位置:Python中文网/ 问答频道 /正文

一定有一个简单的方法来做这件事,但不知何故我可以把我的头包起来。我能描述我想要的最好的方法是一个类的lambda函数。我有一个库,它期望使用一个类的未实例化版本作为参数。然后它实例化类本身来处理。问题是,我希望能够动态地创建类的版本并传递给库,但是我不知道如何去做,因为库需要一个未实例化的版本。下面的代码描述了问题:

class Double:
    def run(self,x):
        return x*2

class Triple:
    def run(self,x):
        return x*3

class Multiply:
    def __init__(self,mult):
        self.mult = mult
    def run(self,x):
        return x*self.mult

class Library:
    def __init__(self,c):
        self.c = c()
    def Op(self,val):
        return self.c.run(val)

op1 = Double
op2 = Triple
#op3 = Multiply(5)

lib1 = Library(op1)
lib2 = Library(op2)
#lib3 = Library(op3)

print lib1.Op(2)
print lib2.Op(2)
#print lib3.Op(2)

我不能使用泛型Multiply类,因为我必须先实例化它,这会破坏库“AttributeError:Multiply instance has nocallmethod”。不用换图书馆的课,我有办法吗?


Tags: 实例方法runself版本returndeflibrary
3条回答

库是否真的指定它想要一个“未初始化的版本”(即类引用)?

在我看来,库实际上需要一个对象工厂。在这种情况下,可以输入:

lib3 = Library(lambda: Multiply(5))

要了解lambda的工作原理,请考虑以下内容:

Multiply5 = lambda: Multiply(5)
assert Multiply5().run(3) == Multiply(5).run(3)

这是一种欺骗,但是您可以给乘法类一个返回自身的__call__方法:

class Multiply:
    def __init__(self,mult):
        self.mult = mult
    def __call__(self):
        return self
    def run(self,x):
        return x*self.mult

这样,当库调用c()时,它实际上调用c.__call__(),返回所需的对象。

根本不需要兰姆达。lambda只是用来定义一个函数并同时使用它的同位糖。就像任何lambda调用都可以用显式def替换一样,我们可以通过创建满足您需要的真实类并返回它来解决您的问题。

class Double:
        def run(self,x):
            return x*2

class Triple:
    def run(self,x):
        return x*3

def createMultiplier(n):
    class Multiply:
        def run(self,x):
            return x*n
    return Multiply

class Library:
    def __init__(self,c):
        self.c = c()
    def Op(self,val):
        return self.c.run(val)

op1 = Double
op2 = Triple
op3 = createMultiplier(5)

lib1 = Library(op1)
lib2 = Library(op2)
lib3 = Library(op3)

print lib1.Op(2)
print lib2.Op(2)
print lib3.Op(2)

相关问题 更多 >