我应该使用抽象类吗?

时间:2013-10-11 14:06:16

标签: python oop

我已经读过这是在Python中实现抽象类的最佳方法(而不是abc模块):

class Animal(object):
    def speak(self):
        raise NotImplementedError()

class Duck(Animal):
    def speak(self):
        print("quack")

class Cat(Animal):
    def speak(self):
        print("meow")

但是,我应该使用抽象类吗?我应该或不应该只使用一个这样的课程:

class Duck(object):
    def speak(self):
        print("quack")

class Cat(Animal):
    def speak(self):
        print("meow")

5 个答案:

答案 0 :(得分:5)

这个问题没有一个答案。你需要动物类型之间的一致界面吗?然后某种抽象基类会很有用,无论它是来自abc还是来自{{1}}。如果鸭子是唯一的动物,或者它们之间几乎没有相似之处,那么很少有点。

答案 1 :(得分:4)

如果所有功能都存在于具体类中 - 就像您的示例中的情况那样 - 我认为使用基类没有任何好处。

但是,如果某些功能可以由子类共享(即并非所有Animal的方法都是抽象的),那么可以认为拥有一个共同的基类将是有益的。然后可以将公共功能放入基类中并由子类自动共享。

答案 2 :(得分:1)

这取决于你想要做什么。例如,如果您打算拥有许多其他动物类(狗,猫,狐狸),并且您希望他们都做一些标准程序(例如,跑一会儿,然后说出他们的特定声音),那么一个抽象的超类可以避免重复的代码。

答案 3 :(得分:0)

如果你只有一个Duck类,那是你唯一拥有的动物类型,那么拥有一个Animal类可能不值得额外的工作。另一方面,如果你想拥有多只动物并且需要一种与所有动物交界的通用方式而不关心它是哪种类型的动物,那么抽象类是有用的。这实际上取决于你正在进行的项目。

答案 4 :(得分:0)

旁注:在强类型语言中,通用接口的抽象类的很多原因是为了满足打字系统,即如果你想要类似

的话。
int myfunc(Animal)

你发了

int myfunc(Duck)

这只有在Duck实际上是Animal的子类时才有效,即使接口是相同的;否则会在不匹配的类型上抛出编译器错误。

在python中,python不关心类型是什么,只关注您访问的属性或方法。所以很多这些案例不再绝对需要基类。但它仍然是一个好主意恕我直言,因为你可以把功能'这个期待一个动物',而不是'这需要一个类A,B,C'或(更糟糕的是)'这需要一个实现x的对象, y,z与这些签名一起发挥作用。您以后更容易阅读,更容易让他人使用。