Python:什么时候应该使用子类而不是方法?

Python:什么时候应该使用子类而不是方法?,python,class,methods,subclass,Python,Class,Methods,Subclass,比如说,我正在尝试两种搜索算法,二进制搜索和线性搜索。在我看来,有三种方法可以做到这一点 选项1:使用两种方法创建一个类Search(),binary\u Search和linear\u Search。搜索算法将取决于用户选择使用哪种方法。示例:用户将创建对象s=Search(),然后使用s.binary\u Search() 选项2:使用方法do\u Search创建一个类Search(),该方法基于什么调用两个私有方法\u binary\u Search和\u linear\u Search

比如说,我正在尝试两种搜索算法,二进制搜索和线性搜索。在我看来,有三种方法可以做到这一点

选项1:使用两种方法创建一个类
Search()
binary\u Search
linear\u Search
。搜索算法将取决于用户选择使用哪种方法。示例:用户将创建对象
s=Search()
,然后使用
s.binary\u Search()

选项2:使用方法
do\u Search
创建一个类
Search()
,该方法基于什么调用两个私有方法
\u binary\u Search
\u linear\u Search
值被传递给
\uuuuu init\uuuu
参数。示例:用户将创建对象
b=Search('binary')

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

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


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

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

但假设您有一个场景,其中有一些原因需要保存状态。例如,假设您在同一个数组上执行多个搜索,您有理由相信连续搜索的结果在数组中往往很接近。您可能希望保存每次搜索的结果,以便通过搜索附近的索引开始下一次搜索。在这种情况下,您可能希望使用类。在这种情况下,您可以根据存储的状态(在本例中是先前的结果)是否与所有算法相关来区分选项3和其他选项。如果所有算法都可以使用相同的保存状态,那么让一个类具有多个搜索方法可能是有意义的,默认情况下只需选择最佳的搜索方法,但如果客户机代码选择,则允许他们选择该方法-这类似于选项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\u search()
linear\u search()
),因为在很多情况下,您知道哪种算法最好,并且可以选择那个算法。我能想到的不提供这种意义上的泛型方法的唯一原因是,如果您真的无法判断要使用哪种算法,在不同的情况下是否需要不同的算法,并且您需要让客户端代码选择要使用哪种算法。

这些类似乎都没有添加任何有用的内容。为什么不写两个函数而不写类呢?我想用一个简单的例子,这样我的问题就容易理解了。我认为总体问题/概念仍然有效,尽管在这种情况下,它可以仅使用函数完成。区分这三个选项将允许您在实际需要类结构时确定最佳选项。非常好的解释,谢谢。我想我有一个例子,说明在哪里可以保存状态。我应该编辑我的问题以反映新的例子,还是编辑太大?我不太确定。如果你首先写的问题是为了反映一个更现实的例子,那就更好了,但是现在你已经得到了答案,最好还是保持问题的原样——或者至少,不要以使现有答案无效的方式编辑它。(这是一般的礼节,我这么说不仅仅是因为我写了答案。)如果你可以使用你的新例子进行编辑,但不会使我的答案不适用,那就去做吧。