在同一类的不同实例之间实现逻辑

2024-09-29 00:22:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在同一类的不同实例之间实现一些逻辑,但不知道如何正确地实现。审查和建议都是必需的

最好从一个例子开始。假设我有一个类foo。这个类中有三个属性idgroupnitem

要实现的逻辑是,同一组下的fooif的实例应该具有相同的项数(即nitem

有些人可能已经注意到我已经在实例之间实现了一个逻辑,它通过foo._id计算实例的数量。但是你也可以很容易地理解这种方法是多么幼稚。如果创建三个foo实例并删除中间的实例。最后一个实例仍将具有id=3

class foo(object):
    _id = 0
    def __init__(self, group, nitem):
        foo._id += 1
        self.id = foo._id
        self.group = group
        self.nitem = nitem

if __name__ == "__main__":
    a = foo(1, 100)
    b = foo(2, 10) #no error. Different groups can have different nitem.
    c = foo(1, 10) # I want this to raise error.Same groups can't have different nitem.

Tags: 实例selfid属性foohavegrouperror
2条回答

重写__new__以在对象实例化时执行检查:

https://docs.python.org/3/reference/datamodel.html#object.new

from typing import Any


class foo(object):
    _groups = {}

    def __new__(cls, group, nitem) -> Any:
        if group not in cls._groups:
            cls._groups[group] = nitem
        if cls._groups[group] == nitem:
            return super().__new__(cls)
        raise ValueError('mismatched group and nitems')

    def __init__(self, group, nitem):
        self.group = group
        self.nitem = nitem


if __name__ == "__main__":
    a = foo(1, 100)
    b = foo(2, 10)
    c = foo(2, 100)

输出:

Traceback (most recent call last):
  File "app.py", line 23, in <module>
    c = foo(2, 100)
  File "app.py", line 12, in __new__
    raise ValueError('mismatched group and nitems')
ValueError: mismatched group and nitems

创建c时会出错

由于使用特定的nitem编号定义的组的数量有限,因此您可以简单地使用字典,其中键是组名称,项是允许该组拥有的nitem编号。然后在构造函数中,您可以简单地使用字典将默认值分配给组对应的nitem

例如:

group_dict = {"students": 5,
              "teachers": 10}

class foo(object):
    def __init__(self, group, nitem=group_dict[str(group)]):
        self.group = group
        self.nitem = nitem

相关问题 更多 >