[英]Design pattern for implementing different “bundles” of functions in Python 3.6
所以我有一組距離函數和相應的計算,例如平均值,比較
而且我希望能夠遍歷這些不同的距離以計算其值/平均值/任何值,並輕松添加新的距離
現在,我正在使用嵌套字典來完成此操作,但是這取決於現有的所有功能並正常工作,所以我想知道是否存在一種可以解決此問題的設計模式?
我的第一個想法是一個元類,它定義需要存在的功能以及實現這些功能的類。 但是,這些Distance類將沒有有意義的實例。 然后,我的第二個想法是定義一個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通常是習慣性的,也是為了限制使用(在此示例中,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的鴨子輸入法(也適用於接口定義),您實際上並不需要實際定義的基類,但是它有助於顯示每個“ Space”類的期望。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.