2010-11-18 11 views
1

私はPython 3を使用していますが、質問は実際には特定の言語に限定されていません。サブテーブルの実装(テーブルへの表示):クラス関係の設計

私はclass Tableに主キーを持つテーブルを実装しています。そのクラスのインスタンスには実際のデータ(非常に大きい)が含まれています。

私は、テーブルの行にフィルタを提供することによってサブテーブルを作成できるようにしたいと考えています。私はテーブルをコピーしたくないので、私は親テーブルのプライマリキーのサブセットだけをサブテーブルに残すつもりです。明らかに、サブテーブルは親テーブルへのビューに過ぎない。親テーブルが変更された場合は変更され、親テーブルが破棄された場合は無効になり、親テーブルから削除された場合は一部の行が失われます。 [EDIT:明らかにするために、親テーブルが変更された場合、私はサブテーブルにどうなるか気にしません。どんな動作でも問題ありません。]

どのように2つのクラスを接続すればよいですか?私が考えていた:

class Subtable(Table): 
    def __init__(self, table, filter_function): 
    # ... 

私の仮定はSubtableが少し行がである場合にだけチェックするために継承されたメソッドをオーバーライドする以外、Tableのインタフェースを保持していることだったこれは良い実装ですか。?

問題は、渡されたテーブルオブジェクトをコピーしたくないと仮定して、Subtableインスタンスを初期化する方法がわかりません。それも可能ですか?

また、私はclass TableSubtableインスタンスを返すインスタンスメソッドを与えることを考えていました。それはSubtableTableの依存関係を作成し、避ける方が良いでしょうか?私が使用するつもりだ

+0

このデータ構造をデータベースに移動することを検討しましたか? Pythonには、メモリ内にSQL DBを作成できる 'sqlite3'があります。 – katrielalex

+0

はい、しかし、今はカスタム実装に固執することに決めました。 – max

答えて

1

次(私はこのような構成に非常にうまく機能し、このようなソートなど多くの方法、省略、省略エラー処理):基本的に

class Table: 
    def __init__(self, *columns, pkey = None): 
     self.pkey = pkey 
     self.__columns = columns 
     self.__data = {} 

    def __contains__(self, key): 
     return key in self.__data 

    def __iter__(self): 
     for key in self.__order: 
      yield key 

    def __len__(self): 
     return len(self.__data) 

    def items(self): 
     for key in self.__order: 
      yield key, self.__data[key] 

    def insert(self, *unnamed, **named): 
     if len(unnamed) > 0: 
      row_dict = {} 
      for column_id, column in enumerate(self.__columns): 
       row_dict[column] = unnamed[column_id] 
     else: 
      row_dict = named 
     key = row_dict[self.pkey] 
     self.__data[key] = row_dict 

class Subtable(Table): 
    def __init__(self, table, row_filter): 
     self.__order = [] 
     self.__data = {} 
     for key, row in table.items(): 
      if row_filter(row): 
       self.__data[key] = row 

を、私は主をコピーしていますキーのみを使用し、それらに関連付けられたデータへの参照を作成します。親テーブル内の行が破棄された場合でも、それはまだサブテーブルに存在します。親テーブルで行が変更された場合は、そのテーブルもサブテーブル内で変更されます。私の要件は「親テーブルが変更されたときに何かが起こる」ため、これは問題ありません。

このデザインに問題がある場合は、お知らせください。

関連する問題