如何获取python3数据类实例的索引?

拉提科达

我想限制数据类实例的最大数量,并知道实例的索引。这是我想要的行为:

Veget('tomato', 2.4, 5)
Veget('salad', 3.5, 2)
Veget('carot', 1.2, 7)

for Veget in Veget.instances:
    print(Veget)
Veget(index=0, name='tomato', price=2.4, quantity=5)
Veget(index=1, name='salad', price=3.5, quantity=2)
Veget(index=2, name='carot', price=1.2, quantity=7)

我尝试了以下方法,该方法确实可以处理创建限制:

from dataclasses import dataclass

MAX_COUNT = 3


class Limited:

    instances = []

    def __new__(cls, *_):
        if len(cls.instances) < MAX_COUNT:
            newobj = super().__new__(cls)
            cls.instances.append(newobj)
            return newobj
        else:
            raise RuntimeError('Too many instances')

@dataclass
class Veget(Limited):
    name: str
    price: float
    quantity: int

但是打印时不会显示索引:

Veget(name='tomato', price=2.4, quantity=5)
Veget(name='salad', price=3.5, quantity=2)
Veget(name='carot', price=1.2, quantity=7)
阿恩

通常通过指定方法__post_init__而不是使用对象继承来对数据类施加隐式限制或需要某种验证利用它的实现可能看起来像这样,我认为这将更易于维护和理解:

from dataclasses import dataclass, field

MAX_COUNT = 3
VEGET_INDEX = []


@dataclass
class Veget:
    index: int = field(init=False)
    name: str
    price: float
    quantity: int

    def __post_init__(self):
        self.index = len(VEGET_INDEX)
        if self.index >= MAX_COUNT:
            raise RuntimeError("Too many instances")
        VEGET_INDEX.append(self)

您也可以使用计数器来代替在post init例程中递增的列表,但是对于调试目的,引用列表似乎很方便。无论如何,创建三个允许的实例并尝试创建第四个实例如下所示:

>>> Veget('tomato', 2.4, 5)
Veget(index=0, name='tomato', price=2.4, quantity=5)
>>> Veget('salad', 3.5, 2)
Veget(index=1, name='salad', price=3.5, quantity=2)
>>> Veget('carot', 1.2, 7)
Veget(index=2, name='carot', price=1.2, quantity=7)
>>> Veget('potato', 0.7, 3)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<string>", line 5, in __init__
  File "<input>", line 17, in __post_init__
RuntimeError: Too many instances

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在python3中获取str类型的类的名称?

如何在Python3中获取“旧” zip()?

如何在python3中获取小数除法余数?

如何在python3中检索类类型的子类?

Python3:编辑通过urllib获取的数据

获取列表中相似连续元素的索引(Python3)

Python3。类,继承

打印类实例列表的随机实例,但得到RecursionError python3

python3上的scrapy如何获取在JavaScript上工作的文本数据

带有** kwargs(星号)的python3数据类

使用python3从json文件中获取数据。如何从数据池打印特定部分?

在Python3中为特定类的实例分配时执行深度复制

使用python3中的现有超类实例初始化子类

Python3 Deepcopy类实例不起作用

在Python 3中运行类方法后如何获取实例变量

Python数据集类+ PyTorch数据加载器:卡在__getitem__上,如何在测试期间获取索引,标签等?

如何获取类实例变量,Python

如何在Python3中的类中调用函数

如何获取任何类的实例?

Python3中的唯一类实例

如何在python3中获取不断增长的列表的数据

在 Python3 中如何使用户定义的类对象可以通过索引( obj[ i ] )获取元素?

如何从python3中的ImmutableMultiDict获取数据

如何从数据帧python3中获取特定列的Pandas中的用户输入

如何使用 Python3 打开/关闭 CloudSQL 实例

如何在python3中使用psycopg2从postgres获取数据,包括列名

ValueError() 是 python3 中 Exception 类的实例吗?

在子类python3中获取超类输入参数

如何使用 df.to_csv 为多索引数据框 python3 格式化 csv 文件