Python:dataclass的uniqe整数?

Python:dataclass的uniqe整数?,python,python-dataclasses,Python,Python Dataclasses,我有以下数据类 @dataclass(frozen=True) class myDataClass: x: float y: float 我想要的是,每次我创建这个类的对象时,它都会被标记为一个从0递增的唯一id 所以,当我第一次说first=myDataClass(0,1)时,我应该有first.id==0,然后如果我说second=myDataClass(0,1),我应该得到second.id==1对于冻结的数据类来说有点棘手,因为您编写的任何动态更新字段的代码都会遇到Fr

我有以下数据类

@dataclass(frozen=True)
class myDataClass:
    x: float
    y: float
我想要的是,每次我创建这个类的对象时,它都会被标记为一个从0递增的唯一id


所以,当我第一次说
first=myDataClass(0,1)
时,我应该有
first.id==0
,然后如果我说
second=myDataClass(0,1)
,我应该得到
second.id==1
对于冻结的数据类来说有点棘手,因为您编写的任何动态更新字段的代码都会遇到
FrozenInstanceError
,但这肯定是可能的:

从数据类导入数据类,字段
@数据类(冻结=真)
类别myDataClass:
x:浮动
y:浮子
id:int=field(init=False)
定义后初始化(自):
如果不是hasattr(myDataClass,“\u计数”):
myDataClass.\u计数=0
对象。设置属性(self,“id”,myDataClass。计数)
myDataClass.\u计数+=1
应该按照您的预期工作:

>(myDataClass(1.0,2.0))
myDataClass(x=1.0,y=2.0,id=0)
>>>(myDataClass(1.0,2.0))
myDataClass(x=1.0,y=2.0,id=1)
>>>(myDataClass(1.0,2.0))
myDataClass(x=1.0,y=2.0,id=2)
>>>(myDataClass(1.0,2.0))
myDataClass(x=1.0,y=2.0,id=3)

您可以使用
default\u factory
作为数据类的属性,这些属性的功能与您想要的一样,并使用类变量跟踪所使用的最大id

from dataclasses import dataclass, field
from typing import ClassVar


def _assign_id():
    new_id = myDataClass._next_id
    myDataClass._next_id += 1
    return new_id


@dataclass(frozen=True)
class myDataClass:
    x: float
    y: float
    id: int = field(default_factory=_assign_id, init=False)
    _next_id: ClassVar[int] = 0

线程安全唯一ID可以通过使用作为字段的默认工厂来生成:

from dataclasses import dataclass, field
from itertools import count

@dataclass(frozen=True)
class myDataClass:
    x: float
    y: float
    id: int = field(default_factory=count().__next__, init=False)

它比其他选项更快,不涉及自定义代码,并且至少在CPython引用解释器上是线程安全的(
itertools.count
是用C实现的,并且不释放GIL,因此不可能有两个实例获得相同的
id
)。

ohh,这真是太好了。