2017-12-19 5 views
0

Ich muss in der Lage sein, eine HashTable-Klasse zu umbrechen. Nach dem Lesen von Wrappern bin ich mir ziemlich sicher, dass dies eine schlechte Verwendung eines Wrappers ist, aber es ist in meiner Aufgabe. (Ich habe verschiedene Datenstrukturen, die leicht in einem Programm ausgetauscht werden müssen)Wrapping meiner HashTable-Klasse

Ich habe den folgenden Code:

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) 

Wenn ich:

x = HashTableWrapper("linearProbe", 100) 

Alles ist aber in Ordnung, wenn ich würde verwenden Sie die folgende:

x.tableInsert(4, 6) 

bekomme ich folgende Fehlermeldung: Attribute: ‚HashTabl eWrapper 'Objekt hat kein Attribut' HashTable ' Ich denke, etwas stimmt nicht mit dem Return-Teil, da Python auch alle HashTable-Teile hervorhebt. Einige Hilfe wäre willkommen.

Edit: Ich habe das folgende Beispiel:

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

Ja, es hat kein 'HashTable'-Attribut - Sie haben * nicht * zusammengestellt, um einen Wrapper zu erstellen, den Sie * geerbt haben *. Es sollte nur z.B. 'self.tableInsert (searchKey, neuesItem)'. Aber dann stellt sich die Frage: Was ist der Zweck des Wrappers? – jonrsharpe

+0

Wenn ich jetzt versuche, ein Objekt einzufügen, bekomme ich: [Vorherige Zeile wurde 995 weitere Male wiederholt] RecursionError: Maximale Rekursionstiefe überschritten. Ich denke, der Punkt ist, dass meine hashtable, binarysearchtree, 2-3-4tree usw. alle ihre ähnlichen Funktionen werden die gleichen Namen wegen der Wrapper haben. Wenn ich also zu einer anderen Struktur wechseln möchte, kann ich einfach einen anderen Wrapper importieren, aber alle Funktionsnamen bleiben gleich. Oder liege ich falsch? – goml

+0

Tut mir leid, ja, wenn du es nur auf "self" nennst, bekommst du eine endlose Rekursion. Sie benötigen 'super(). TableInsert (...)', um die Elternklassenversion der Methode aufzurufen, genau wie in '__init__'. Und wenn das Wrapper-Interface identisch mit dem Parent-Interface ist, gibt es keinen Vorteil. – jonrsharpe

Antwort

-1

self.HashTable wird so nie initialisiert Aufruf self.HashTable.<function or variable> würde nie funktionieren. Wenn das HashTable-Objekt die Methode tableInsert hat, dann alles, was Sie tun müssen, ist

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) 

, da die Funktionen/Methoden aus der HashTable vererbt werden.