gpt4 book ai didi

python - 在元类中实例化刚刚创建的类会导致 RuntimeError ("super(): empty __class__ cell")

转载 作者:太空狗 更新时间:2023-10-30 00:06:38 25 4
gpt4 key购买 nike

所以我有这个元类,我想用它来自动注册新组件,即一些基本组件类的子类。当注册一个新组件时,它的实例应该被传递给处理它的register_component()函数。

元类代码(精简版):

class AutoRegisteredMeta(type):
def __new__(metacls, name, bases, attrs):

# ... (omitted) check if "name" has already been registered ...

new_class = super().__new__(metacls, name, bases, attrs)
register_component(name, new_class()) # RuntimeError(super(): empty __class__ cell)
return new_class

问题是调用 new_class() 会导致错误 - 但不是对所有类。经过一些实验后,我意识到只有子类在其自己的 __init__() 方法中调用 super().__init__() 时才会发生这种情况。

示例组件和基类:

class BaseComponent(metaclass=AutoRegisteredMeta):
def __init__(self):
# do some work here ...

class ComponentFoo(BaseComponent):
def __init__(self):
super().__init__() # <--- RuntimeError occurs here
self.foo = 'bar'

我在这里做错了什么?读书this我发现我可能不应该在元类的 __new__()__init__() 中进行实例化,对吗?这也许可以以某种方式规避吗?

此外,一些通俗易懂的解释会很好,我不太了解 CPython 实现的内部结构。

提前致谢!

(FWIW,我使用 Python 3.3.6,Ubuntu)


编辑:我正在添加所请求的最小示例,您可以直接运行它并自己查看操作中的错误。

#!/usr/bin/env python3


class AutoRegisteredMeta(type):
def __new__(metacls, name, bases, attrs):
new_class = super().__new__(metacls, name, bases, attrs)
new_class() # <--- RuntimeError can occur here
return new_class


class BaseComponent(metaclass=AutoRegisteredMeta):
def __init__(self):
print("BaseComponent __init__()")


class GoodComponent(BaseComponent):
def __init__(self):
print("GoodComponent __init__()")


class BadComponent(BaseComponent):
def __init__(self):
print("BadComponent __init__()")
super().__init__() # <--- RuntimeError occurs because of this

最佳答案

也许这行得通:

#!/usr/bin/env python3


class AutoRegisteredMeta(type):
def __new__(metacls, name, bases, attrs):
new_class = super().__new__(metacls, name, bases, attrs)
new_class()
return new_class


class BaseComponent(metaclass=AutoRegisteredMeta):
def __init__(self):
print("BaseComponent __init__()")


class GoodComponent(BaseComponent):
def __init__(self):
print("GoodComponent __init__()")


class BadComponent(BaseComponent):
def __init__(self):
print("BadComponent __init__()")
super(self.__class__, self).__init__()

关于python - 在元类中实例化刚刚创建的类会导致 RuntimeError ("super(): empty __class__ cell"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31003110/

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