1
私は、セットの要素を特定のクラスのインスタンスに制限したいと思います。サブクラス化してaddメソッドをオーバーライドする必要がありますか?どうすればいい?python 2.7でaddメソッドの型をチェックするセットを実装する正しい方法は何ですか?
私は、セットの要素を特定のクラスのインスタンスに制限したいと思います。サブクラス化してaddメソッドをオーバーライドする必要がありますか?どうすればいい?python 2.7でaddメソッドの型をチェックするセットを実装する正しい方法は何ですか?
まず、カスタムオブジェクトのセットを作成するときは、this questionとその回答を参照する必要があります。 set
できるだけでなく
class Foo:
def __init__(self, value=0):
self.value = value
def __hash__(self):
return self.value
def __eq__(self, other):
return isinstance(other, Foo) and self.value == other.value
は今、あなたはオブジェクトを比較することができ、そして:簡単に言えば、あなたがセットに追加することができるような__hash__()
や__eq__()
などのメソッドを定義する必要があります
In [19]: a = Foo()
In [20]: b = Foo()
In [21]: c = Foo(1)
In [22]: a == b
Out[22]: True
In [23]: b == c
Out[23]: False
In [24]: s = set([a, b, c])
In [25]: s
Out[25]:
set([<__main__.Foo instance at 0x267f758>,
<__main__.Foo instance at 0x267f950>])
In [26]: s.add(Foo())
In [27]: s
Out[27]:
set([<__main__.Foo instance at 0x267f758>,
<__main__.Foo instance at 0x267f950>])
問題がある、あなたはまだセットに完全に異なる何かを追加することができます
In [28]: s.add(1)
In [29]: s
Out[29]:
set([<__main__.Foo instance at 0x267f758>,
<__main__.Foo instance at 0x267f950>,
1])
一つの方法は、を上書きすることであろう方法のをご提案ください:
In [30]: class FooSet(set):
....: def add(self, elem):
....: if isinstance(elem, Foo):
....: set.add(self, elem)
....: else:
....: raise TypeError('%s is not a Foo' % elem)
....: # or just put "pass" here for silent behavior
In [31]: s = FooSet([a, b, c])
In [32]: s
Out[32]:
set([<__main__.Foo instance at 0x267f758>,
<__main__.Foo instance at 0x267f950>])
In [33]: s.add(Foo())
In [34]: s
Out[34]:
set([<__main__.Foo instance at 0x267f758>,
<__main__.Foo instance at 0x267f950>])
In [35]: s.add(Foo(2))
In [36]: s
Out[36]:
set([<__main__.Foo instance at 0x267f758>,
<__main__.Foo instance at 0x267f950>,
<__main__.Foo instance at 0x26808c0>])
In [37]: s.add(2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
...
TypeError: 2 is not a Foo