我能在定义继承类时避免使用```metaclass=```吗?

1 投票
1 回答
41 浏览
提问于 2025-04-14 15:44

我想要一个自定义的元类,它的样子看起来像是定义一个 TypedDict

当我们声明一个新的 TypedDict 时,写法大概是这样的:

from typing import TypedDict

class MyClass(TypedDict, total=False):
  pass

但是,当我声明一个元类时,写法就变成这样:

class MetaSerial(type):
  def __new__(pls, name, bases, act, exclude: list[str] = [], custom: list[str] = []):
    dct["_exclude"] = exclude
    dct["_custom"] = custom
    return super().__new__(cls, name, bases, dct)

class Serial(metaclass=MetaSerial, exclude=["value"], custom=["terminals"]):
  pass

所以,问题来了:有没有办法让我去掉烦人的 metaclass=,用类似这样的写法:

class Serial(MetaSerial, exclude=["value"], custom=["terminals"]):
  pass

1 个回答

1

尽量避免使用元类(你定义的每一个元类都有可能和其他元类发生冲突)。在这里,你只需要一个基础类,并且在里面定义一个合适的 __init_subclass__ 方法就可以了。

class SerialBase:
    def __init_subclass__(cls, exclude: list[str] = None, custom: list[str] = None, **kwargs):
        super().__init_subclass__(**kwargs)
        if exclude is None:
            exclude = []

        if custom is None:
            custom = []

        cls._exclude = exclude
        cls._custom = custom

class Serial(SerialBase, exclude=["value"], custom=["terminals"]):
    pass

撰写回答