例子代码
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