如何获取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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

如何从python3中的ImmutableMultiDict获取数据

来自分类Dev

如何获取类实例变量,Python

来自分类Dev

Python3中的唯一类实例

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何获取任何类的实例?

来自分类Dev

python3:类中的singledispatch,如何调度自类型

来自分类Dev

如何在Python3中的类中使用Truediv?

来自分类Dev

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

来自分类Dev

如何从基于列索引的python数据框中获取价值?

来自分类Dev

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

来自分类Dev

如何使用gio和python3获取文件图标

来自分类Dev

如何获取网页中的所有单词 - Python3

来自分类Dev

如何创建python类的实例

来自分类Dev

Python:如何在同一个类中获取类的创建实例?

来自分类Dev

如何从向量获取真实的类实例名称?

来自分类Dev

如何从 Method 实例获取类注释?

来自分类Dev

如何获取类实例类型签名

来自分类Dev

Python3 / Numpy:ndarray条件索引

来自分类Dev

python3 - 如何从跨度中抓取数据

来自分类Dev

如何计算python3数据帧中列的频率

来自分类Dev

Python3 数据输入

来自分类Dev

如何按类获取点击元素的索引?

来自分类Dev

从类方法调用实例方法,在python3中允许,在python 2中不允许?

来自分类Dev

如何访问类的目的实例并传递数据?

来自分类Dev

python3,boto3,使ec2实例的第二个ip获取

Related 相关文章

  1. 1

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

  2. 2

    如何从python3中的ImmutableMultiDict获取数据

  3. 3

    如何获取类实例变量,Python

  4. 4

    Python3中的唯一类实例

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

    如何获取任何类的实例?

  10. 10

    python3:类中的singledispatch,如何调度自类型

  11. 11

    如何在Python3中的类中使用Truediv?

  12. 12

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

  13. 13

    如何从基于列索引的python数据框中获取价值?

  14. 14

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

  15. 15

    如何使用gio和python3获取文件图标

  16. 16

    如何获取网页中的所有单词 - Python3

  17. 17

    如何创建python类的实例

  18. 18

    Python:如何在同一个类中获取类的创建实例?

  19. 19

    如何从向量获取真实的类实例名称?

  20. 20

    如何从 Method 实例获取类注释?

  21. 21

    如何获取类实例类型签名

  22. 22

    Python3 / Numpy:ndarray条件索引

  23. 23

    python3 - 如何从跨度中抓取数据

  24. 24

    如何计算python3数据帧中列的频率

  25. 25

    Python3 数据输入

  26. 26

    如何按类获取点击元素的索引?

  27. 27

    从类方法调用实例方法,在python3中允许,在python 2中不允许?

  28. 28

    如何访问类的目的实例并传递数据?

  29. 29

    python3,boto3,使ec2实例的第二个ip获取

热门标签

归档