Python中抽象类和接口的区别是什么?


当前回答

用更基本的方式解释: 界面有点像一个空的松饼盘。 它是一个类文件,带有一组没有代码的方法定义。

抽象类也是如此,但并非所有函数都需要为空。有些可以有代码。严格来说,它不是空的。

为什么区分: 在Python中没有太大的实际区别,但在大型项目的规划级别上,讨论接口可能更常见,因为没有代码。特别是当您与熟悉这个术语的Java程序员一起工作时。

其他回答

通常,接口只在使用单继承类模型的语言中使用。在这些单继承语言中,如果任何类都可以使用特定的方法或方法集,则通常使用接口。同样,在这些单继承语言中,抽象类被用来定义除了没有或多个方法之外的类变量,或者利用单继承模型来限制可以使用一组方法的类的范围。

支持多重继承模型的语言倾向于只使用类或抽象基类,而不使用接口。由于Python支持多重继承,因此它不使用接口,您可能希望使用基类或抽象基类。

http://docs.python.org/library/abc.html

Python实际上没有这两个概念。

它使用鸭子打字,这就不需要接口了(至少对计算机来说是这样的:-))

Python <= 2.5: 基类显然是存在的,但是没有显式的方法将一个方法标记为“纯虚”,因此类并不是真正抽象的。

Python >= 2.6: 抽象基类确实存在(http://docs.python.org/library/abc.html)。并允许您指定必须在子类中实现的方法。我不太喜欢它的语法,但它的特性是存在的。大多数情况下,从“using”客户端使用duck输入可能更好。

抽象类是包含一个或多个抽象方法的类。除了抽象方法,抽象类还可以有静态方法、类方法和实例方法。 但在接口的情况下,它将只有抽象的方法没有其他。因此,继承抽象类不是强制性的,但继承接口是强制性的。

用更基本的方式解释: 界面有点像一个空的松饼盘。 它是一个类文件,带有一组没有代码的方法定义。

抽象类也是如此,但并非所有函数都需要为空。有些可以有代码。严格来说,它不是空的。

为什么区分: 在Python中没有太大的实际区别,但在大型项目的规划级别上,讨论接口可能更常见,因为没有代码。特别是当您与熟悉这个术语的Java程序员一起工作时。

有时你会看到以下情况:

class Abstract1:
    """Some description that tells you it's abstract,
    often listing the methods you're expected to supply."""

    def aMethod(self):
        raise NotImplementedError("Should have implemented this")

因为Python没有(也不需要)正式的Interface契约,所以抽象和接口之间不存在java风格的区别。如果有人努力定义一个正式的接口,它也将是一个抽象类。唯一的区别是文档字符串中声明的意图。

抽象和界面之间的区别是非常细微的当你使用鸭子打字的时候。

Java使用接口是因为它没有多重继承。

因为Python具有多重继承,所以您可能还会看到类似这样的东西

class SomeAbstraction:
    pass  # lots of stuff - but missing something

class Mixin1:
    def something(self):
        pass  # one implementation

class Mixin2:
    def something(self):
        pass  # another

class Concrete1(SomeAbstraction, Mixin1):
    pass

class Concrete2(SomeAbstraction, Mixin2):
    pass

这使用了一种带有mixin的抽象超类来创建分离的具体子类。