未使用@dataclass装饰器时,类中的dataclass式语法有何作用?
Python中@dataclass与类成员注解的区别
借助@dataclass装饰器,你可以用类似结构体的简洁语法定义类:
from dataclasses import dataclass @dataclass class A: a: int
这段代码大致等价于下面的实现(实际上@dataclass还会自动生成__repr__、__eq__等更多实用方法):
class A: def __init__(self, a: int): self.a = a
不过你可能会发现,不用@dataclass时也能直接在类里写变量注解:
class B: a: int
但这种写法并没有实际作用,尝试实例化或直接访问时会报错:
>>> B(1) TypeError: B() takes no arguments >>> B.a AttributeError: type object 'B' has no attribute 'a'
这是因为在普通类中仅写a: int只是给类添加了注解元信息,并不会自动生成构造方法,也不会把a转化为类属性或实例属性。这个注解只会存放在B.__annotations__字典里(你可以通过print(B.__annotations__)看到{'a': int}),除此之外没有其他实际功能。
而@dataclass装饰器会读取这些注解,自动帮你生成初始化方法、字符串表示方法等,把注解的成员转化为实例属性,这才是两者的核心区别。
内容的提问来源于stack exchange,提问作者Dominic JL
相关产品推荐
相关产品推荐

