提问人:Alex 提问时间:11/12/2023 最后编辑:jonrsharpeAlex 更新时间:11/13/2023 访问量:46
Python 数据类在抽象类中自动增加 ID
Python dataclass automate ID incrementation in abstract class
问:
我想使用 abstract 方法为我的 Python 子类创建唯一的 ID 增量,但我不知道如何分离每个子类的 ID 值集。这是我的代码:
from dataclasses import dataclass, field
from itertools import count
@dataclass
class Basic:
identifier: int = field(default_factory=count().__next__, init=False)
def __init_subclass__(cls, **__):
super().__init_subclass__(**__)
# cls.identifier: int = field(default_factory=count().__next__, init=False)
class A(Basic):
pass
class B(Basic):
pass
当我想分离子类时,id 值在子类之间共享:
>>> import stack
>>> stack.A()
A(identifier=0)
>>> stack.B()
B(identifier=1)
你知道如何解决问题吗?我认为这是一个解决方案,但我不确定如何让它发挥作用。__init_subclass__
答:
1赞
relent95
11/13/2023
#1
该库不适合您的用例。将数据类视为具有默认值的可变命名元组。我建议实现具体的类。dataclasses
但是,如果您坚持,可以通过定义另一个装饰器来执行以下操作,该装饰器在调用 .(这假设使用 Python 3.10 或更高版本。dataclasses.dataclass()
from dataclasses import dataclass, field
from itertools import count
def dataclass_with_id(cls):
setattr(cls, 'identifier', field(default_factory=count().__next__, init=False))
cls.__annotations__['identifier'] = int
return dataclass(cls)
@dataclass_with_id
class A:
pass
@dataclass_with_id
class B:
pass
print(A(), A())
print(B(), B())
如果你想在一个公共基类中做这项工作,你需要破解模块的内部实现。但不要这样做,因为它会在将来的 Python 版本中被破坏。__init_subclass__()
dataclasses
评论