gpt4 book ai didi

python - 为什么在python中使用抽象类时要声明metaclass=abc.ABCMeta?

转载 作者:行者123 更新时间:2023-12-02 18:13:57 24 4
gpt4 key购买 nike

我在网上看代码的时候遇到过以下使用抽象类的情况:

from abc import abstractmethod,ABCMeta
class Generator(object,metaclass=ABCMeta):
@abstractmethod
def generate(self):
raise NotImplementedError("method not implemented")
generator=Generator()
generator.generate()

如预期的那样返回以下错误:

TypeError:无法使用抽象方法生成实例化抽象类生成器

但是如果我这样写(唯一不同的是在第二行)

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 metaclass provides a method called register method that can be invoked by its instance. By using this register method, any abstract base class can become an ancestor of any arbitrary concrete class.

但这还是没有让我明白声明metaclass=ABCMeta的必要性,感觉@abstractmethod修改方法就够了。

最佳答案

您“需要”metaclass=ABCMeta 在实例化时执行规则。

generator=Generator()  # Errors immediately when using ABCMeta
generator.generate() # Only errors if and when you call generate otherwise

想象一下,如果类有几个抽象方法,只有其中一些在子类中实现。它可能会工作很长一段时间,只有当你开始调用一个未实现的方法时才会出错。在依赖 ABC 之前急于失败通常是一件好事,就像函数引发异常通常比返回 None 来指示失败通常更好;您想在出现错误时立即知道,而不是在不知道错误的最终原因的情况下得到奇怪的错误。

旁注:有一种比显式使用 metaclass=ABCMeta 语法更简洁的 ABC 方法:

from abc import abstractmethod, ABC

class Generator(ABC):

Python 几乎总是创建使用元类的空基类来简化使用(特别是在 2 到 3 的过渡时期,没有兼容的元类语法在两者中都有效,直接继承是唯一有效的方法)。

关于python - 为什么在python中使用抽象类时要声明metaclass=abc.ABCMeta?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71902156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com