【问题标题】:Best Practice for passing arguments in a class Python在 Python 类中传递参数的最佳实践
【发布时间】:2021-04-18 23:00:51
【问题描述】:

我是 OOP 新手,我很确定我即将解决问题的方法不是最聪明的。

我正在构建一个自定义 K-means 算法,并希望为不同的距离函数提供选项。

我要解决的方法是构建 if 语句并分别计算距离。

例如:

class ExampleDist():
    def __init__(self, measure="euklid"):
        self.measure = measure
    
    def euklid_distance(x_1,x_2):
        dist = np.linalg.norm(x_1-x_2)
        return dist
    
    def abs_distance(x_1,x_2):
        dist = np.absolute(x_1-x_2)
        return dist
    
    def dist(self, x_1, x_2):
        if(self.measure == "euklid"):
            self.dist = euklid_distance(x_1,x_2)
        elif(self.measure == "abs"):
            self.dist = abs_distance(x_1,x_2)

dist1 = ExampleDist(measure = "euklid")
dist1.dist(np.array([1,1]),np.array([0,2]))

但是在 K-Mean 算法中,我必须复制粘贴整个循环,在该循环中计算数据点和质心之间的距离,并且只更改距离。

复制粘贴从来都不是一个好的解决方案,所以我希望有一个解决方案可以自动传递我想要使用的距离度量。 像这样(伪代码):

class ExampleDist():
    def __init__(self, measure="euklid"):
        self.measure = measure
    
    def euklid_distance(x_1,x_2):
        dist = np.linalg.norm(x_1-x_2)
        return dist
    
    def abs_distance(x_1,x_2):
        dist = np.absolute(x_1-x_2)
        return dist
    
    def dist(self, x_1, x_2):
        self.dist = [self.meassure]_distance(x_1,x_2)

dist1 = ExampleDist(measure = "euklid")
dist1.dist(np.array([1,1]),np.array([0,2]))

【问题讨论】:

    标签: python class oop arguments parameter-passing


    【解决方案1】:

    为什么不只创建一个 dist 函数,例如:

    class ExampleDist():
        def __init__(self, measure="euklid"):
            self.measure = measure
    
        def dist(self, x_1, x_2):
            if self.measure == 'euklid':
                return np.linalg.norm(x_1-x_2)
            elif self.measure == 'absolute':
                return np.absolute(x_1-x_2)
            else:
                return None
    

    【讨论】:

    • 我觉得自己很蠢……但看起来不错,谢谢哈哈!
    【解决方案2】:

    假设您将拥有的所有距离函数都将接受相同的参数(x1x2),您可以使用 dict 在距离类型和距离函数之间进行映射。

    这是实现这一目标的最可扩展和最灵活的方法之一。

    class ExampleDist():
        _distance_funcs = {'euclid': np.linalg.norm,
                           'abs': np.absolute}  
                            # or implement your own wrappers as in your example
    
        def dist(self, x1, x2, measure):
            try:
                return self._distance_funcs[measure](x1, x2)
            except KeyError:
                raise ValueError(f"`measure` should be one of {', '.join(self._distance_funcs.keys())}")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2023-03-30
      • 2017-02-08
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多