我有一个基类来为各种类提供功能,并且我想确保从该类继承的类都用@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
有机会运行。有解决这个问题的好方法吗?
答案 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.