如何确保子类是数据类?

时间:2019-07-30 11:10:41

标签: python python-3.x python-dataclasses

我有一个基类来为各种类提供功能,并且我想确保从该类继承的类都用@dataclass装饰。以下定义导致ValueError的产生:

from dataclasses import dataclass, is_dataclass


class Base:
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        if not is_dataclass(cls):
            raise ValueError('Base subclasses should be dataclasses.')


@dataclass
class Child(Base):
    ...

据我了解,这是由于继承发生(因此Base.__init_subclass__(Child)正在运行)之前 @dataclass有机会运行。有解决这个问题的好方法吗?

1 个答案:

答案 0 :(得分:0)

也许您可以装饰您的班级。这是想法(请相应调整)。

给出

import dataclasses as dc

代码

def verify_dataclass(kls):
    if not dc.is_dataclass(kls):
        print(f"'{kls.__name__}' is not a dataclass.")
        # Do something
    return kls

演示

数据类还可以。

@verify_dataclass
@dc.dataclass
class Foo:
    pass

数据类的子类是可以的。

@verify_dataclass
class Bar(Foo):
    pass

常规课程警告。

@verify_dataclass
class Baz:
    pass

# 'Baz' is not a dataclass.