python中的抽象基class怎么能被实例化呢?

How come an abstract base class in python can be instantiated?

令我感到非常惊讶的是,我可以在python中实例化一个抽象class:

from abc import ABC

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

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

上面的代码编译得很好,并打印出预期的结果。这不是违背了ABC的初衷吗?

如果您没有抽象方法,您将能够实例化class。如果你至少有一个,你不会。在读起来像

的代码中
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元class和至少一个抽象方法的组合,会导致你无法实例化一个class。如果您省略两者之一,您将能够这样做。