重新加载frozenset的子类

时间:2014-06-07 12:32:35

标签: python inheritance python-3.x set

我有一个类,我希望拥有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会很好但我不想这样做(它在代码中看起来很糟糕,因为有更多类似更新的函数)。

1 个答案:

答案 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)