在python3.6中实现不同函数“束”的设计模式

2024-04-19 19:31:05 发布

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

所以我有一组距离函数和相应的计算,比如平均值,比较

我希望能够迭代这些不同的距离来计算它们的值/平均值/值,并使添加新距离变得容易

现在,我通过使用嵌套字典来实现这一点,但是这取决于现有的所有函数以及它们是否正常工作,所以我想知道是否有一种设计模式可以解决这个问题?你知道吗

我的第一个想法是定义需要存在哪些函数以及实现这些函数的类的元类。但是,这样就不会有这些距离类的有意义的实例。 我当时的第二个想法是定义一个Distance类,并将函数作为该类的属性,但这种风格似乎不太好。 第二个想法的例子:

class Distance:
    def __init__(self, distf, meanf):
        self.distf = distf
        self.meanf = meanf

    def dist(self, x1,x2):
        return self.distf(x1,x2)

    def mean(self, xs):
         return self.meanf(xs)

    d = Distance(lambda x,y: abs(x-y), np.mean)

    d.dist(1,2) ##returns 1 as expected
    d.dist([1,2]) ## returns 1.5 as expected

这是可行的(而且还加强了函数的存在性/甚至可能是属性),但是如上所述的感觉是相当糟糕的风格。我不打算发布这段代码,它只是为了保持它的干净和组织,如果这是相关的。 我希望问题是明确的,如果没有请不要犹豫评论,我会努力澄清。你知道吗

编辑: -@维克多:一切都应该先定下来。在运行时只应进行选择。 -@abarnert大多是习惯性的,也要限制使用(np.平均值在本例中,需要在没有axis参数的情况下调用),但这应该是不相关的,因为我没有发布这个 -@juanpa会调查的


Tags: 函数self距离return属性定义风格dist
1条回答
网友
1楼 · 发布于 2024-04-19 19:31:05

似乎简单的继承就是你所需要的。 因此,创建一个基类BaseSpace,它基本上是一个接口:

from abc import ABC

class BaseSpace(ABC):
    @staticmethod
    def dist(x1, x2):
        raise NotImplementedError()

    @staticmethod
    def mean(xs):
        raise NotImplementedError()

然后,您只需使用所需函数的所有不同组合继承此接口,在类内部(如果只使用一次)或外部实现方法,并在类定义中分配它们:

class ExampleSpace(BaseSpace):
    @staticmethod
    def dist(x1, x2):
        return abs(x1 - x2)

    mean = staticmethod(np.mean)

由于Python的duck typing方法(也适用于接口定义),您实际上并不需要实际定义的基类,但它有助于显示每个“Space”类的预期内容。你知道吗

相关问题 更多 >