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
使用__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) <string> in __init__(self, name, age) <ipython-input-2-1e8016803a1d> in __post_init __(self) 6 def __post_init__(self): 7 if self.age < 0: ----> 8 raise
个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。
因此,为了实现这些额外的处理,一个新的魔术方法__post_init__就诞生了。一起看下这个方法在我们要封装的对象中长什么样子: ?
torch.nn.Module = InceptionResnetV1(pretrained='vggface2').eval() center: torch.Tensor = None def __post_init
但是它不支持__post_init__方法来进行更高级的值检查,正如我上一篇文章[12]中所述。
compare=False) edited: datetime = field(default=datetime.now(), repr=False, compare=False) def __post_init
扫码关注腾讯云开发者
领取腾讯云代金券