我想在同一个类的不同实例之间实现一些逻辑,但是我没有适当的方法。都需要审查和建议。
最好从一个例子开始。假设我有一个foo
类。此类中有三个属性-id
,group
和nitem
。
要实现的逻辑是foo
的实例(如果属于同一组)应该具有相同数量的项(即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.
答案 0 :(得分:1)
覆盖__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
答案 1 :(得分:0)
由于使用特定的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