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

Python 在同一类的不同实例之间实现逻辑,python,python-3.x,class,oop,Python,Python 3.x,Class,Oop,我想在同一类的不同实例之间实现一些逻辑,但不知道如何正确地实现。审查和建议都是必需的 最好从一个例子开始。假设我有一个类foo。此类中有三个属性-id、group和nitem 要实现的逻辑是,同一组下的fooif实例应具有相同数量的项(即nitem) 有些人可能已经注意到,我已经在实例之间实现了一个逻辑,它通过foo.\u id计算实例的数量。但你也可以很容易地理解这种方法是多么幼稚。如果创建三个foo实例并删除中间的实例。最后一个实例仍然具有id=3 class foo(object):

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

最好从一个例子开始。假设我有一个类
foo
。此类中有三个属性-
id
group
nitem

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

有些人可能已经注意到,我已经在实例之间实现了一个逻辑,它通过
foo.\u 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.

由于使用特定的
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

重写
\uuuuu new\uuuuuu
以在对象实例化时执行检查:

从键入import Any
类foo(对象):
_组={}
def(新)(cls,group,nitem)->任何:
如果组不在cls中。\u组:
cls.\u组[组]=nitem
如果cls.\u组[组]==nitem:
返回super()
raise VALUERROR('组和子项不匹配')
定义初始化(自身、组、nitem):
self.group=组
self.nitem=nitem
如果名称=“\uuuuu main\uuuuuuuu”:
a=foo(1100)
b=foo(2,10)
c=foo(2100)
输出:

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
回溯(最近一次呼叫最后一次):
文件“app.py”,第23行,在
c=foo(2100)
文件“app.py”,第12行,新__
raise VALUERROR('组和子项不匹配')
ValueError:组和子项不匹配

创建
c

时会引发错误。如果一个实例的引用计数为零,并且被Python的垃圾收集从内存中删除,我如何相应地更新
cls.\u groups