Python中的抽象基类为什么可以被实例化?

3

对我来说,令人惊讶的是我可以在Python中实例化一个抽象类:

from abc import ABC

class Duck(ABC):
    def __init__(self, name):
        self.name = name

if __name__=="__main__":
    d = Duck("Bob")
    print(d.name)

上述代码编译正常,并打印出了预期结果。这样做是否有点违背ABC的初衷呢?

2
如果你没有抽象方法,使用ABC有什么意义呢? - wim
不错的观点,但是如果文档明确说明ABCabstractmethod组合才是Python中真正抽象类的关键,那就更好了。 - user32882
1
这在 PEP 中是明确规定的(搜索 "at least one method")。在文档中也有类似的陈述("... 除非覆盖了其所有抽象方法和属性,否则无法实例化" - 如果没有抽象方法,则实际上所有方法都已被覆盖)。 - wim
1个回答

7

如果您没有抽象方法,您将能够实例化该类。但如果您有至少一个抽象方法,则不能实例化该类。代码中应如下:

from abc import ABC, abstractmethod

class Duck(ABC):
    def __init__(self, name):
        self.name = name

    @abstractmethod
    def implement_me(self):
        ...

if __name__=="__main__":
    d = Duck("Bob")
    print(d.name)

TypeError: Can't instantiate abstract class Duck with abstract method implent_me

如果你组合使用ABC元类和至少一个abstractmethod,那么你将无法实例化一个类。如果你省略其中之一,那么你就可以实例化一个类。


不是这样的。我能够毫无问题地编译你的代码。 - user32882
@user32882 不,这个答案是正确的。上面的代码可以正常编译,但会抛出运行时错误。 - juanpa.arrivillaga
2
没关系。您是正确的,添加abstractmethod表示代码无法运行... - user32882

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接