簡體   English   中英

在Python 3.6中實現不同功能“捆綁”的設計模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM