1

クラスのオブジェクトが set() 関数で動作するようにクラスのメソッドを実装することは可能ですか? したがって、 Set(objarray) は一意のオブジェクトを返します。もちろん、独自のセットを作成することもできますが、車輪が既にある場合は、車輪を再発明したくありません.

編集 : 私はあなたの部下を私の英語と混同させたと思います. これが私のクラスにあるものです。メンバーとして人の名前と住所を持つ Person クラスがあります。これが私がやりたいことです -

persons = []
for i in range (50):
  name = raw_input("Enter Name")
  address = raw_input("Address")
  persons.append(Person(name,address))
unique = Set(persons) #would only return one person from an address. 
                      #The rest from the same address will be removed

明確な混乱を願っています。

4

1 に答える 1

3

はい。まず、クラスが も__hash__も実装していない__eq__場合、それらはすでにハッシュ可能です (idはハッシュ値として使用され、比較は によって行われisます)。

または、 and を実装する__hash____eq__、クラス インスタンスをセット内または辞書キーとして安全に使用できます。

>>> class Foo:
...     def __init__(self, val): self.val = val
...     def __hash__(self): return hash(self.val)
...     def __eq__(self, other): return self.val == other.val
...     def __repr__(self): return 'Foo(%r)' % self.val
... 
>>> print set([Foo(3), Foo("bar")])
set([Foo(3), Foo('bar')])

setクラスのインスタンスを直接呼び出せるようにする場合は、オーバーロード__iter__して、クラス インスタンスが反復可能に見えるようにします。

>>> class CharSeq:
...     def __init__(self, first, last):
...         self.first = ord(first)
...         self.last = ord(last)
...     def __iter__(self):
...         return (chr(i) for i in xrange(self.first, self.last+1))
... 
>>> set(CharSeq('a', 'c'))
set(['a', 'c', 'b'])
于 2012-10-07T01:39:54.420 に答える