Python 数据类在抽象类中自动增加 ID

Python dataclass automate ID incrementation in abstract class

提问人:Alex 提问时间:11/12/2023 最后编辑:jonrsharpeAlex 更新时间:11/13/2023 访问量:46

问:

我想使用 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__

蟒蛇 python-dataclasses

评论


答:

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