具有元类注册的数据类

2024-04-25 13:57:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataclass a,它可以被继承并用于创建其他类。每次继承类A时,我都希望将子类注册到容器中。我想用元类来解决它,但它对我不起作用。需要帮忙吗

container = {}

class Meta(type):
    def __new__(mcs, *args, **kwargs):
        new_class = super().__new__(mcs, *args, **kwargs)

        if new_class.__name__ != 'A':
            container[new_class.__name__] = new_class

        return new_class


@metaclass
class MasterClass:
    parent


@metaclass
class A(MasterClass, metaclass=Meta):
    my_arg


@metaclass
class Child(A): # <-- this class I would like to register into child container
    my_next_arg


Tags: namenewmycontainerargargs子类容器
1条回答
网友
1楼 · 发布于 2024-04-25 13:57:42

您的代码几乎是正确的,但是在应该是“@dataclass”装饰器时使用“@metaclass”,并在字段上创建一些注释,否则将出现NameError异常

所以,如果你只是这样做:

from dataclasses import dataclass
from typing import Any
container = {}

class Meta(type):
    def __new__(mcs, *args, **kwargs):
        new_class = super().__new__(mcs, *args, **kwargs)

        if new_class.__name__ != 'A':
            container[new_class.__name__] = new_class

        return new_class


@dataclass
class MasterClass:
    parent: Any


@dataclass
class A(MasterClass, metaclass=Meta):
    my_arg: Any


@dataclass
class Child(A): # <  this class I would like to register into child container
    my_next_arg: Any

它将如您所期望的那样工作,并且Child将在 容器:

In [5]: container                                                                                                                    
Out[5]: {'Child': __main__.Child}

请注意,由于Python3.6,您不需要使用元类 对于这个模式,调用__init_subclass__类方法 在创建子类时,可以执行相同的操作:


from dataclasses import dataclass
from typing import Any

container = {}

@dataclass
class MasterClass:
    parent: Any


@dataclass
class A(MasterClass):
    def __init_subclass__(cls, *args, **kw):
        super().__init_subclass__(*args, **kw)
        container[cls.__name__] = cls

    my_arg: Any


@dataclass
class Child(A): # <  this class I would like to register into child container
    my_next_arg: Any

相关问题 更多 >