- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类似于下面的目录结构:
.
├── main.py
├── model.py
└── models
├── __init__.py
├── model_a.py
└── model_b.py
model.py
包含一个抽象基类:
from abc import ABCMeta, abstractmethod
class Base(metaclass=ABCMeta):
@abstractmethod
def run(self):
pass
在 models
文件夹中是这个基类的两个实现,model_a.py
和 model_b.py
,它们将自己注册到 main 基
类。 model_a.py
看起来像这样:
from model import Base
class ModelA(Base):
def run(self):
return "a"
ModelA.register(Base)
assert issubclass(ModelA, Base)
和model_b.py
类似。
现在,我在 main.py
中尝试做的是创建 Base
的所有子类的字典,以便我可以选择一个(通过 GUI我的程序)并运行它:
from model import Base
subclasses = Base.__subclasses__()
dct = {cls.__name__: cls for cls in subclasses}
klass = dct['ModelA']
klass.run()
但我无法让它工作。当我尝试执行其中一个派生类并且 main.py
中的字典为空时,我得到了 RuntimeError: Refusing to create an inheritance cycle
。
最佳答案
我意识到这已经很晚了,但万一它对其他偶然发现这个的人有帮助......
这里有一些问题:
你的类(class)是错误的register
称呼;只有在这种情况下调用 Base.register(ModelA)
才有意义(不是反过来)为了注册ModelA
作为 Base
的“virtual subclass” .
调用 ModelA.register(Base)
正在尝试注册 Base
作为 ModelA
的虚拟子类,但是 ModelA
已经是 Base
的实际子类, - 这就是您获得继承周期的原因。您不能让类 X 和 Y 相互继承。
然而,作为ModelA
明确是 Base
的子类, 你不需要打电话 register
根本。您想要:
class ModelA(Base):
...
没有 register
调用(此处 ModelA
是 Base
的实际子类),或者:
class ModelA:
...
Base.register(ModelA)
(此处 ModelA
是一个独立的类,在 Base
的继承层次之外,但它被注册为一个虚拟子类)。要么/要么 - 不能两者兼而有之。
无论哪种情况,issubclass(ModelA, Base)
将是 True
.
__subclasses__()
不选择虚拟子类,只有实际的子类 - 所以如果你想使用它,你应该忘记 register()
然后制作ModelA
Base
的真正子类(上面的第一个选项)。
(在我看来,这是整个 ABC/register
机制的缺陷:issubclass()
可能是 True
但 __subclasses__()
没有捡起来 - 讨厌。)
如果您不导入包含ModelA
的模型在你执行的某些点,它从来没有设置所以ModelA
不会出现在 Base.__subclassess__()
中反正。这可能就是为什么字典在 main.py
是空的。
解决方法是在 main.py
中添加一行说import models
, 并有 models/__init__.py
进口 model_a
和 model_b
.然后当main
运行,它导入 models
, 又进口 model_a
和 model_a
, 执行 ModelA
的定义和 ModelB
并将它们添加到 Base
的类层次结构。
在最后一行,您没有实例化任何类的实例 klass
指着;该行应该是:
klass().run()
关于python-3.x - 获取 ABCMeta 的所有注册子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51306462/
通常,为了子类化一个类,我会做类似的事情 class Subby(Parenty): def __init__(self): Parenty.__init__(self) 但是
ABCMeta的register方法有什么用? https://docs.python.org/3/library/abc.html 似乎如果我有一个抽象基类 ABC,比如 Animal,我可以使用
以下dataclass : from abc import ABC from collections.abc import Mapping from dataclasses import datacl
我在网上看代码的时候遇到过以下使用抽象类的情况: from abc import abstractmethod,ABCMeta class Generator(object,metaclass=ABC
我在网上看代码的时候遇到过以下使用抽象类的情况: from abc import abstractmethod,ABCMeta class Generator(object,metaclass=ABC
我想实现一个元类来包装方法以记录附加信息。但我还需要有 abstractmethods。我试图扩展 ABCMeta 但它似乎没有强制执行 @abstractmethod 装饰器: import typ
我有一个类似于下面的目录结构: . ├── main.py ├── model.py └── models ├── __init__.py ├── model_a.py └──
我对 python 3.8 和 mypy 协同工作的方式有疑问。考虑这个代码: from collections.abc import Callable def feeder(get_next_ite
我得到了一个使用 python 的 abc 包的示例代码。我使用 pip 在笔记本电脑中安装了 abc。在 PATH 中正确设置了包文件夹的路径。 我得到的示例代码是: '从 abc 导入 ABC,抽
考虑这段代码 from abc import ABCMeta, abstractmethod class C(): @abstractmethod def my_abstract_me
我有以下代码来比较基类的当前(空)所需功能的实现与其子类,子类必须以某种不同的方式实现它们,以便在运行时被认为是可接受的。如果不使用 metaclass=ABCMeta 并在这些基类方法上实现 @ab
这个问题在这里已经有了答案: Create an abstract Enum class (3 个答案) 关闭 3 年前。 简单示例 目标是通过从 abc.ABCMeta 和 enum.EnumMe
在 Python 3.4+ 中,我们可以这样做 class Foo(abc.ABC): ... 或者我们可以做 class Foo(metaclass=abc.ABCMeta): ..
我在 python 中看到了两种定义抽象类的方法.有什么区别,分别有哪些使用场景? from abc import ABCMeta, abstractmethod class AbstactClass
我正在通过标记我的几个函数来试用 Python 3.5 的输入模块。 虽然我在 PyCharm 中收到警告,但我有一个返回列表的函数。 警告内容如下: Class 'ABCMeta' does not
我有一个 class1 需要从两个不同的元类继承,即 Meta1 和 abc.ABCMeta 当前实现: Meta1 的实现: class Meta1(type): def __new__(c
我一直在用 python 中的 abc 模块进行一些试验。啦啦啦 >>> import abc 在正常情况下,如果 ABC 类包含未实现的 abstractmethod,您希望它不会被实例化。你知道如
我在 Linux 上使用 PyDev 编写代码时遇到了这个奇怪的错误。即使像这样的简单代码也会产生错误 print 'Hello World' 错误在这里 True Traceback (most r
我将 Python 3.7.3 与 PyCharm 结合使用。当我尝试将 abc 包导入到我的项目中时,我收到此错误,然后是 Python 意外退出 警告对话框: Fatal Python error
在 Python 中,当尝试使用 irc-8.1.1 的示例程序 irccat2.py 时,出现此错误。我无法在网上的任何地方找到它的记录。有谁知道这意味着什么,我该如何解决?谢谢。 Tracebac
我是一名优秀的程序员,十分优秀!