我有一个类,我希望拥有frozenset的所有功能,但我不希望他可配置(通过init,freezeset可以迭代)。
此外,我希望他具有“重新加载”功能 - 我从服务器加载静态列表,因此用户无法更改它(因此我不希望用户认为他可以更改它)。 管理员可以更改服务器上的列表,因此我需要重新加载选项。
这就是我所希望的:
class A(frozenset):
def __init__(self, list_id):
super().__init__()
self.list_id = list_id
self.reload()
def reload(self):
#loading staff by self.list_id...
pass
但是我没有找到一种方法来向班级“添加”新员工(我试图重新启动它)。
可能是我使用了错误的工作人员,所以如果你有另一种方法,那就好了(我需要选择比较不同对象之间的区别):
a = A(1)
b = A(2)
len(a)
iter(a)
a.difference(b)
可能会超载添加和更新set会很好但我不想这样做(它在代码中看起来很糟糕,因为有更多类似更新的函数)。
答案 0 :(得分:1)
您无法更新frozenset
内容,不能;它甚至在子类化时仍然是不可变的。
您可以改为collections.abc.Set()
Abstract Base Class的子类;它也模拟了一个不可变的集合;您需要做的就是实现Abstract Methods column中列出的方法,其余的工作将由您负责:
from collections.abc import Set
class A(Set):
def __init__(self, list_id):
self.list_id = list_id
self.reload()
def reload(self):
values = get_values(self.list_id)
self._values = frozenset(values)
def __contains__(self, item):
return item in self._values
def __iter__(self):
return iter(self._values)
def __len__(self):
return len(self._values)
未实现 built-in frozenset
type的所有方法;您可以轻松提供缺失的那些,因为它们是运算符方法的别名:
def issubset(self, other):
return self <= frozenset(other)
def issuperset(self, other):
return self >= frozenset(other)
def union(self, *others):
res = self
for o in others:
res |= frozenset(o)
return res
def intersection(self, *others):
res = self
for o in others:
res &= frozenset(o)
return res
def difference(self, *others):
res = self
for o in others:
res -= frozenset(o)
return res
def symmetric_difference(self, other):
return self ^ frozenset(other)