使用__post_init__方法进行一些初始化操作 使用dataclass装饰的类一个主要优势就是不用手动去实现__init__方法,但我们经常需要在对象初始化的时候对一些数据进行校验或者额外操作,此时一个选择是手动实现...__init__方法,其中会有大段的模板代码例如self.a=a;self.b=b,另一个选择是定义__post_init__方法来进行初始化操作,例如: In [1]: from dataclasses...@dataclass ...: class Person: ...: name:str ...: age:int ...: ...: def __post_init...--> 1 Person('Mike',-1) in __init__(self, name, age) in __post_init...__(self) 6 def __post_init__(self): 7 if self.age < 0: ----> 8 raise
init参数如果设置为False,表示不为这个field生成初始化操作,dataclass提供了hook——__post_init__供我们利用这一特性: @dataclass class C:...a: int b: int c: int = field(init=False) def __post_init__(self): self.c = self.a...+ self.b __post_init__在__init__后被调用,我们可以在这里初始化那些需要前置条件的field。...如果指定一个field的类型注解为dataclasses.InitVar,那么这个field将只会在初始化过程中(__init__和__post_init__)可以被使用,当初始化完成后访问该field...dataclass class C: i: int j: int = None database: InitVar[DatabaseType] = None def __post_init
_instance # 读取配置文件 def __post_init__(self): """如果配置文件存在就用配置文件中的值,覆盖默认值。..._instance # 读取配置文件 def __post_init__(self): """如果配置文件存在就用配置文件中的值,覆盖默认值;在这个过程中如果遇到异常就保持默认值
因此,为了实现这些额外的处理,一个新的魔术方法__post_init__就诞生了。一起看下这个方法在我们要封装的对象中长什么样子: ?
dataclass @dataclass class Person(object): first_name: str last_name: str age: int def __post_init
torch.nn.Module = InceptionResnetV1(pretrained='vggface2').eval() center: torch.Tensor = None def __post_init
__init__(*args, **kwargs) def __post_init__(self): """ 在初始化 ModelOutput 类的实例之后执行的操作
但是它不支持__post_init__方法来进行更高级的值检查,正如我上一篇文章[12]中所述。
compare=False) edited: datetime = field(default=datetime.now(), repr=False, compare=False) def __post_init
领取专属 10元无门槛券
手把手带您无忧上云