import attr import typing @attr.s(auto_attribs=True) class A: x: int y: str z: float = 0.0 A() @attr.s(init=True, auto_attribs=True) class A2: x: int y: str z: float = 0.0 A2() @attr.s(init=False, auto_attribs=True) class B1: x: int = 1 y: str = "2" z: float = 0.0 B1() @attr.s(init=False, auto_attribs=True) class B2: x: int y: str z: float = 0.0 def __init__(self, x: int): self.x = x self.y = str(x) self.z = 0.0 B2() @attr.s(auto_attribs=True) class C1: a: typing.ClassVar[int] b: int C1() @attr.dataclass class D1: x: int y: str = "0" D1() @attr.dataclass class E1: _x: int E1() @attr.dataclass class F1: foo = "bar" # <- has no type annotation, so doesn't count. baz: str F1() @attr.dataclass(unknown=True) class G1: bar: str G1()