用于实现不同功能的设计模式;捆绑;Python 3.6中函数的定义
所以我有一组距离函数和相应的计算,例如平均值,比较值 我希望能够迭代这些不同的距离来计算它们的值/平均值/其他值,并使添加新距离变得容易 现在,我通过使用嵌套字典来实现这一点,但是这取决于现有的所有函数是否正常工作,所以我想知道是否有一种设计模式可以解决这个问题用于实现不同功能的设计模式;捆绑;Python 3.6中函数的定义,python,design-patterns,python-3.6,Python,Design Patterns,Python 3.6,所以我有一组距离函数和相应的计算,例如平均值,比较值 我希望能够迭代这些不同的距离来计算它们的值/平均值/其他值,并使添加新距离变得容易 现在,我通过使用嵌套字典来实现这一点,但是这取决于现有的所有函数是否正常工作,所以我想知道是否有一种设计模式可以解决这个问题 我的第一个想法是定义需要存在哪些函数以及实现这些函数的类的元类。但是,这些距离类将没有任何有意义的实例。 我当时的第二个想法是定义一个Distance类,并将函数作为该类的属性,但这种风格似乎不好。 第二个想法的示例: class Di
我的第一个想法是定义需要存在哪些函数以及实现这些函数的类的元类。但是,这些距离类将没有任何有意义的实例。 我当时的第二个想法是定义一个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
这是可行的(并且还强制函数的存在性/甚至可能是属性),但如上所述,这感觉相当糟糕。我不打算发布这段代码,如果相关的话,我只是想保持代码的整洁和条理。
我希望问题是明确的,如果没有请不要犹豫发表评论,我会试图澄清
编辑:
-@victor:一切都应该先安排好。在运行时,只应进行选择。
-@abarnert主要是习惯性的,也是为了限制使用(在本例中,需要在没有axis参数的情况下调用np.mean),但这应该是不相关的,因为我没有发布这篇文章
-@juanpa将对此进行调查看来简单的继承就是你所需要的。 因此,您创建了一个基类
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的方法(也适用于接口定义),您实际上并不需要实际定义的基类,但它有助于显示对每个“空间”类的期望值。似乎您需要的是简单的继承。 因此,您创建了一个基类
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的方法(也适用于接口定义),您实际上并不需要实际定义的基类,但它有助于显示每个“空间”类的预期值。是否需要添加新的“空间类型”(即距离和辅助函数集,如平均值、比较值等)在运行时动态地或者所有的“空格”最初都在程序中设置?有没有理由让它们看起来像方法,而不是直接调用
d.distf
来调用您存储在d
上的函数?“我的第一个想法是定义需要存在哪些函数以及实现这些函数的类的元类。”也许你想要abc模块?你能告诉我你打算用它做什么吗?拥有一个实例包含函数集合的类并不是一件坏事,但它实际上取决于您将如何使用它。在你的程序中,“距离”的概念作为概念性的东西有意义吗?“距离”是否应该有一个接受两个数字的距离方法?如果是这样,那么这就是正确的模型。您是否需要在运行时动态添加新的“空间类型”(即距离和辅助函数集,如平均值、比较值等),或者所有“空间”最初都在程序中设置?这些需要看起来像方法的原因是什么,不是直接调用d.distf
来调用您存储在d
上的函数?“我的第一个想法是定义需要存在哪些函数以及实现这些函数的类的元类。”也许您需要abc
模块?您能告诉我您计划使用它做什么吗?拥有一个实例包含函数集合的类并不是一件坏事,但它实际上取决于您将如何使用它。在你的程序中,“距离”的概念作为概念性的东西有意义吗?“距离”是否应该有一个接受两个数字的距离方法?如果是这样,那么这就是正确的模型。您的BaseSpace
可能应该是一个,以防止人们意外地实例化它,并强制其具体子级实现其方法。已更新类以从ABC
继承。不确定是否需要强制子级实现所有方法-我猜某些空间可能会错过某些方法。您的BaseSpace
可能应该是一个,以防止人们意外实例化它,并强制其具体子级实现其方法。已更新该类以从ABC
继承。我不确定是否需要强制孩子们实现所有的方法——我想一些空格可能会错过一些方法。