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

use*_*882 3 python oop abstract-class abc

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

from abc import ABC

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

if __name__=="__main__":
    d = Duck("Bob")
    print(d.name)
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*awe 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
Run Code Online (Sandbox Code Playgroud)

它是 ABC 元类和至少一个抽象方法的组合,这将导致您无法实例化一个类。如果您省略两者之一,您将能够这样做。

  • 没关系。你是对的,添加抽象方法意味着代码将无法运行...... (2认同)