对我来说,令人惊讶的是我可以在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的初衷呢?
对我来说,令人惊讶的是我可以在Python中实例化一个抽象类:
from abc import ABC
class Duck(ABC):
def __init__(self, name):
self.name = name
if __name__=="__main__":
d = Duck("Bob")
print(d.name)
如果您没有抽象方法,您将能够实例化该类。但如果您有至少一个抽象方法,则不能实例化该类。代码中应如下:
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,那么你将无法实例化一个类。如果你省略其中之一,那么你就可以实例化一个类。
ABC
和abstractmethod
的组合才是Python中真正抽象类的关键,那就更好了。 - user32882