gpt4 book ai didi

python - ABCMeta.register 的使用

转载 作者:行者123 更新时间:2023-12-05 04:48:37 26 4
gpt4 key购买 nike

ABCMetaregister方法有什么用?

https://docs.python.org/3/library/abc.html

似乎如果我有一个抽象基类 ABC,比如 Animal,我可以使用 register 注册它的子类:

from abc import ABC

class Animal(ABC):
pass

@Animal.register
class Dog:
pass

但是这不就是定义子类继承自基类吗?

class Dog(Animal): # same as wrapping with Animal.register decorator?
pass

换句话说,它只是一种动态定义继承的方式吗?还是我遗漏了此方法的某些功能?

最佳答案

如果您来自具有不同 OOP 风格的语言,那么虚拟基类的概念可能看起来很有趣。

在 register 的文档中有一个小例子,恕我直言解释了虚拟基类的概念

from abc import ABC

class MyABC(ABC):
pass

MyABC.register(tuple)

assert issubclass(tuple, MyABC)
assert isinstance((), MyABC)

代码片段末尾的断言提出了以下问题:

  1. 类型 tupleMyABC 的子类型吗。
  2. ()MyABC 的实例吗。

因为 tuple 是一个内置类并且您不能重新定义它,所以这些断言应该会失败,但它们不会失败,因为 ABCMeta.register “makes” issubclassisinstance 认为您修改了 tuple 类型以从 MyABC 继承,但实际上没有发生继承。

这有很多用例,你应该看看 collections.abc module .

关于python - ABCMeta.register 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67989240/

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