Союз для коллекций. Набор - PullRequest
0 голосов
/ 06 марта 2012

Я определяю свой собственный набор классов, используя collections.Set:

class MySet(collections.Set):
    def __init__(self, data=frozenset()):
        self._set = frozenset(data)
    __len__ = lambda self: self._set.__len__()
    __iter__ = lambda self: self._set.__iter__()
    __contains__ = lambda self: self._set.__contains__()

Я хочу наследовать метод frozenset.union. С помощью этого метода вы можете сделать следующее:

>>> frozenset.union(frozenset('ab'), frozenset('bc'))
frozenset(['a', 'c', 'b'])
>>> frozenset.union(*[frozenset('ab'), frozenset('bc')])
frozenset(['a', 'c', 'b'])

Я хочу иметь возможность сделать следующее:

>>> MySet.union(MySet('ab'), MySet('bc'))
MySet(['a', 'c', 'b'])
>>> MySet.union(*[MySet('ab'), MySet('bc')])
MySet(['a', 'c', 'b'])

Как мне лучше поступить об этом?

Ответы [ 2 ]

1 голос
/ 06 марта 2012

У вас есть __or__, который вызывается при написании s1 | s2 и должен означать объединение двух множеств.

0 голосов
/ 06 марта 2012

Я бы не сказал, что это "лучший способ", но может работать для вашего личного использования?

import collections

class MySet(collections.Set):
    def __init__(self, data=frozenset()):
        self._set = frozenset(data)
    __len__ = lambda self: self._set.__len__()
    __iter__ = lambda self: self._set.__iter__()
    __contains__ = lambda self: self._set.__contains__()
    __union__ = lambda self,j: self._set.union(j)

a = MySet(range(5))
b = MySet(range(3,10))

print a.__union__(b)
print b.__union__(a)

"""
>>>
frozenset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
frozenset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
"""
...