2017-12-19 19 views
0

私はHashTableクラスをラップすることができる必要があります。ラッパーについて読んだら、私はこれがラッパーの悪い使い方だと確信していますが、それは私の割り当てにあります。 (私は簡単にプログラムにスワップする必要が異なるデータ構造を持っている)私のHashTableクラスをラップする

私は次のコードを持っている:私が使用している場合

from HashTable import HashTable 

class HashTableWrapper(HashTable): 

    def __init__(self, probe, size): 
     super().__init__(probe, size) 

    def tableInsert(self, searchKey, newItem): 
     return self.HashTable.tableInsert(searchKey, newItem) 

    def tableRetrieve(self, searchKey): 
     return self.HashTable.tableRetrieve(searchKey) 

    def tableDelete(self, searchKey): 
     return self.HashTable.tableDelete(searchKey) 

を:

x = HashTableWrapper("linearProbe", 100) 

すべてがあれば、しかし、大丈夫です私は次を使用します:

x.tableInsert(4, 6) 

私は次のエラーが発生します:AttributeError: 'HashTabl eWrapperのオブジェクトには 'HashTable'という属性はありません PythonはHashTableのすべての部分をハイライト表示するので、リターン部分に何か問題があると思います。 助けていただければ幸いです。

編集:私は、次の例を得た:

class BSTTableWrapper: 
    def tableInsert(item): 
     return self.bst.searchtreeInsert(item) 
+2

はい、 'HashTable'属性はありません。あなたはラッパーをビルドするために*作っていない*継承*しています。たとえば、 'self.tableInsert(searchKey、newItem)'です。しかし、問題は次のようになります。ラッパーのポイントは何ですか? – jonrsharpe

+0

アイテムを挿入しようとすると、次のようになります。[前の行は995回以上繰り返しました] RecursionError:最大再帰深度を超えました。 私のポイントは、私のハッシュテーブル、binarysearchtree、2-3-4treeなどのすべての同様の関数は、ラッパーのために同じ名前になると思います。だから私は別の構造に切り替える場合は、私は別のラッパーをインポートすることができますが、すべての関数名は同じままになります。または私は間違っていますか? – goml

+0

申し訳ありません、もしあなたが 'self'でそれを呼び出すなら、終わりのない再帰を得るでしょう。 '__init__'のように、親クラスのメソッドを呼び出すには' super()。tableInsert(...) 'が必要です。また、ラッパーインターフェースが親インターフェースと同じであれば、実際には利点はありません。 – jonrsharpe

答えて

-1

self.HashTableはそうself.HashTable.<function or variable>は動作しないだろう呼び出す初期化されることはありません。 HashtableオブジェクトのメソッドtableInsertを持っている場合は関数/メソッドは、ハッシュテーブルから継承されているので、あなたがしなければならないすべては

def tableInsert(self, searchKey, newItem): 
    return self.tableInsert(searchKey, newItem) 

def tableRetrieve(self, searchKey): 
    return self.tableRetrieve(searchKey) 

def tableDelete(self, searchKey): 
    return self.tableDelete(searchKey) 

です。

関連する問題