如何为Python数据类子类实现独立的自增ID
解决Python数据类子类独立自增ID的问题
你遇到的问题根源在于所有子类共享了父类Basic中同一个count实例的迭代器。要让每个子类拥有独立的自增ID序列,只需在__init_subclass__中为每个子类单独初始化专属的计数器字段即可。
修改后的完整代码如下:
from dataclasses import dataclass, field from itertools import count @dataclass class Basic: def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) # 为每个子类创建独立的自增计数器 cls.identifier: int = field(default_factory=count().__next__, init=False) class A(Basic): pass class B(Basic): pass
测试验证:
>>> import stack >>> stack.A() A(identifier=0) >>> stack.A() A(identifier=1) >>> stack.B() B(identifier=0) >>> stack.B() B(identifier=1)
原理说明
当每个子类(比如A、B)继承Basic时,__init_subclass__会被自动调用。此时我们为当前子类动态添加identifier字段,并且为该字段绑定一个全新的count实例的__next__方法作为默认工厂函数。这样每个子类的计数器都是独立的,不会互相干扰。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

