2017-01-19 5 views
2

内のオブジェクトを更新する私は、このクラスの作成:パイソン:セット

class Device(object): 
    """Holds searched SSID, searched BSSID and 
     own MAC-Addr information about a device""" 

    def __init__(self, mac): 
     self.mac = mac 
     self.bssid_set = set() 
     self.ssid_set = set() 

    def add_bssid(self, bssid): 
     self.bssid_set.add(bssid) 

    def add_ssid(self, ssid): 
     self.ssid_set.add(ssid) 

    def __str__(self): 
     ssid_str = ', '.join(self.ssid_set) 
     bssid_str = ', '.join(self.bssid_set) 
     return "{mac} has searched for {ssid_str} and {bssid_str}".format(
       mac = self.mac, 
       ssid_str = ssid_str, 
       bssid_str = bssid_str) 

をし、私が見つけたときに私は、このクラスの複数のオブジェクトを作成する集合(重複なし)でそれらを入れて、オブジェクトを更新したいです別のssidまたはbssidを持つ新しいプローブ要求。そのため、セットの識別子はmacでなければなりません。

セットを正しく使用する方法が見えないか、セットを更新するだけで新しいオブジェクトが追加されるため、間違ったものを試していますが、これは必要ありません。ここに行くための神託の方法だろう

mac = 'abcd' 
ssid = set(['ssid1', 'ssid2']) 
bssid = set(['bssid1', 'bssid2']) 
dict[mac] = [ssid.update('newssid'), bssid.update('newbssid')] 

または何:

ちょうどこのような辞書を使用することが賢明でしょうか?

編集:誤って入れ「」マックの周りのdict

+2

設定は '__hash__'機能による値の戻り値に基づいてオブジェクトのユニークに識別する。オブジェクトの一意性を識別するために必要なロジックでこの関数をオーバーライドすることができます。またチェック:[Pythonでカスタムクラスの設定操作を実行する](http://stackoverflow.com/questions/5754440/performing-set-operations-on-custom-classes-in-python) –

答えて

0

で、私は「あなたがここに間違ったものをしようとしている」と行きますよ。

セット内のオブジェクトは変更されません。予期せずオブジェクトのハッシュ(または比較結果)を変更すると、悪いことが起こり、重複したり、オブジェクトが見つからないことがあります。セットでは、インデックスで物を検索することもできないため、何かを変更する必要がある場合は、セット全体を調べ、必要な変更を加えて新しいものを作成する必要があります。 (ハッシュと比較で内部コレクションを無視する方法で実装できますが...理由は?)

mac -> Deviceのマッピングを標準辞書に入れておくと、おそらくもっと簡単ですmacをナチュラルルックアップキーとして使用します。

+0

OK、私はしていない私が間違った方向にいたかどうかは確かですが、私はそうです。ありがとうございました :) –

1

Defaultdictを行うことができますあなたのクラスが何をしているか

from collections import defaultdict 

d = defaultdict(dict) 
d['mac1']['bssid']=set() 
d['mac1']['ssid']=set() 
d 

出力:

defaultdict(dict, {'mac1': {'bssid': set(), 'ssid': set()}})