当我在线阅读代码时,我遇到了以下使用抽象类的情况:
以下错误信息是预期的:
TypeError: 无法实例化带有抽象方法 generate 的抽象类 Generator 但如果我这样写(唯一不同的是第二行):
虽然错误信息发生了变化,
那么为什么我们需要声明
我从GeeksforGeeks了解到一些东西。
from abc import abstractmethod,ABCMeta
class Generator(object,metaclass=ABCMeta):
@abstractmethod
def generate(self):
raise NotImplementedError("method not implemented")
generator=Generator()
generator.generate()
以下错误信息是预期的:
TypeError: 无法实例化带有抽象方法 generate 的抽象类 Generator 但如果我这样写(唯一不同的是第二行):
from abc import abstractmethod,ABCMeta
class Generator(object):
@abstractmethod
def generate(self):
raise NotImplementedError("method not implemented")
generator=Generator()
generator.generate()
虽然错误信息发生了变化,
NotImplementedError: 方法未实现
但当我实现了generate
方法时,上述两种Generator
的方式都能正常执行。class GeneticAlgorithm(Generator):
def generate(self):
print("ABC")
ga=GeneticAlgorithm()
ga.generate()
>>> ABC
那么为什么我们需要声明
metaclass=ABCMeta
?我从GeeksforGeeks了解到一些东西。
但这仍然不能让我理解声明ABCMeta元类提供了一个名为register的方法,可以由其实例调用。 通过使用此register方法,任何抽象基类都可以成为任意具体类的祖先。
metaclass=ABCMeta
的必要性,感觉@abstractmethod
修改该方法就足够了。