例子代码

from dataclasses import dataclass,field
from typing import List,Dict,Tuple
from copy import copy,deepcopy

@dataclass
class Item:
    x: int
    y: int
    z: int = field(init=False) # 为生成字段

    def __post_init__(self):
        self.z = self.x * self.y

@dataclass
class Item1:
    x: int
    y: int
    z: int = field(init=False,compare=False)    # z不参加比较

    def __post_init__(self):
        self.z = self.x * self.y

@dataclass
class DC:
    a: int
    b: int
    c: int = field(init=False)

    items: List[Item] = field(default_factory=list)

    def __post_init__(self):
        self.c = self.a + self.b

    def cur_item(self):
        return deepcopy(self.items[-1]) if self.items else None



if __name__ == "__main__":
    # dataclasses 的类型演示
    item1 = Item(1,2)
    item2 = Item(10,20)
    item3 = Item(100,200)

    c1 = DC(3,4)

    c1.items += [item1,item2,item3]

    cur_item = c1.cur_item()

    c2 = deepcopy(c1)
    print(f"\nc1==c2 = {c1==c2}")

    print(f"\nitem1={item1},item2={item2},item3={item3}")
    print(f"c1={c1}")
    print(f"cur_item={cur_item}")
    print(f"item3==cur_item = {item3==cur_item}")
    cur_item.x = 66
    print(f"\nitem3==cur_item={item3==cur_item}")
    print(f"cur_item={cur_item}")
    print(f"c1={c1}")
    print(f"item1={item1},item2={item2},item3={item3}")


    # z参加比较的演示
    # 创建a,b两个Item类
    a = Item(1,2)
    b = Item(1,2)

    print(f"z参加比较的演示")
    print(f"a={a},b={b} a==b = {a==b}")
    b.z = 10    # 字段z也是可以被改变的
    print(f"a={a},b={b} a==b = {a==b}")
    b.__post_init__()
    print(f"a={a},b={b} a==b = {a==b}")

    # z不参加比较的演示
    # 创建a,b两个Item类
    a = Item1(1,2)
    b = Item1(1,2)
    print(f"z不参加比较的演示")
    print(f"a={a},b={b} a==b = {a==b}")
    b.z = 10
    print(f"a={a},b={b} a==b = {a==b}")
    b.__post_init__()
    print(f"a={a},b={b} a==b = {a==b}")

运行结果

c1==c2 = True

item1=Item(x=1, y=2, z=2),item2=Item(x=10, y=20, z=200),item3=Item(x=100, y=200, z=20000)
c1=DC(a=3, b=4, c=7, items=[Item(x=1, y=2, z=2), Item(x=10, y=20, z=200), Item(x=100, y=200, z=20000)])
cur_item=Item(x=100, y=200, z=20000)
item3==cur_item = True

item3==cur_item=False
cur_item=Item(x=66, y=200, z=20000)
c1=DC(a=3, b=4, c=7, items=[Item(x=1, y=2, z=2), Item(x=10, y=20, z=200), Item(x=100, y=200, z=20000)])
item1=Item(x=1, y=2, z=2),item2=Item(x=10, y=20, z=200),item3=Item(x=100, y=200, z=20000)
z参加比较的演示
a=Item(x=1, y=2, z=2),b=Item(x=1, y=2, z=2) a==b = True
a=Item(x=1, y=2, z=2),b=Item(x=1, y=2, z=10) a==b = False
a=Item(x=1, y=2, z=2),b=Item(x=1, y=2, z=2) a==b = True
z不参加比较的演示
a=Item1(x=1, y=2, z=2),b=Item1(x=1, y=2, z=2) a==b = True
a=Item1(x=1, y=2, z=2),b=Item1(x=1, y=2, z=10) a==b = True
a=Item1(x=1, y=2, z=2),b=Item1(x=1, y=2, z=2) a==b = True