Python:何时应该使用子类而不是方法?

时间:2017-06-30 21:41:53

标签: python class methods subclass

假设我正在尝试制作一类两种搜索算法,二进制搜索和线性搜索。我看到它的方式有三种方法。

选项1:使用两种方法Search()binary_search制作课程linear_search。然后,搜索算法将取决于用户选择使用哪种方法。示例:用户将创建对象s = Search(),然后使用s.binary_search()

选项2:使用方法Search()制作课程do_search,根据具体内容调用两个私有方法_binary_search_linear_search value传递给__init__参数。示例:用户将创建对象b = Search('binary')

选项3:创建一个基类Search(),其中包含两个子类Binary()Linear()。然后,用户将使用适当的子类选择算法。示例:用户将创建对象b = Binary()

我的问题是你应该使用哪三个选项之一?为什么?

我认为从设计角度来看,选项3是最好的,但我不确定为什么。我也对其他观点感兴趣(不仅仅是设计)。

1 个答案:

答案 0 :(得分:1)

在这种特殊情况下,您可能根本不应该使用类,因为没有保存状态。请记住,类对于将数据与对该数据进行操作的方法一起分组非常有用。但在二进制搜索中,没有数据。我的意思是,你得到一些输入(列表),你对该输入做一些计算以产生一些输出(一个索引),然后你返回输出,就是这样。搜索算法完成后无需保存。所以没有必要上课。

但是假设你有一个场景,有一些理由可以保存状态。例如,假设您在同一个数组上进行多次搜索,您有理由相信连续搜索的结果通常会在数组中靠近。您可能希望保存每个搜索的结果,以便通过搜索附近的索引来启动下一个搜索。当你想要使用一个类时就是这种情况。在这种情况下,您可以根据存储状态(在本例中为先前结果)是否与您的所有算法相关,将选项3与其他选项区分开来。如果所有算法都可以使用相同的保存状态,那么让一个类具有多个搜索方法可能是有意义的,并且默认情况下只选择最佳搜索方法,但允许客户端代码选择方法(如果他们这样选择 - 那个' d类似于选项1和选项2的组合。

def search(self, element, kind='binary'):
    if kind == 'binary':
        return self.binary_search(element)
    elif kind == 'linear':
        return self.linear_search(element)
    else:
        # error
def binary_search(self, element):
    ...
def linear_search(self, element):
    ...

但是如果不同的算法需要不同的保存状态,那么您可能希望使用子类,或者通常使用不同算法的不同类。

我认为使用通用search()方法而不是,或者至少除了个别算法的特定搜索方法之外(例如binary_search()linear_search())是有意义的因为在很多情况下,你知道哪种算法最好,可以选择那种算法。我认为在这种意义上不提供通用方法的唯一原因是,如果你真的不知道使用哪种算法,如果在不同的情况下需要不同的算法,你需要让客户端代码选择使用哪种算法。