在实例化之前不覆盖内置init的数据类的情况下,验证init参数的pythonic方法是什么?

我认为也许利用__new__秘密方法会合适吗?

from dataclasses import dataclass

@dataclass
class MyClass:
    is_good: bool = False
    is_bad: bool = False

    def __new__(cls, *args, **kwargs):
        instance: cls = super(MyClass, cls).__new__(cls, *args, **kwargs)
        if instance.is_good:
            assert not instance.is_bad
        return instance

最佳答案

定义a __post_init__ method on the class;如果定义,生成的__init__将调用它:

from dataclasses import dataclass

@dataclass
class MyClass:
    is_good: bool = False
    is_bad: bool = False

    def __post_init__(self):
        if self.is_good:
            assert not self.is_bad


当使用the replace function创建新实例时,这甚至可以工作。

10-04 12:25