2016-04-14 17 views
2

Probleme mit der Verwendung einer Klasse speziell und Probleme beim Aufruf. Es ist eine höchste Summe-Pfad eines Dreieck-Programms .. aber ich habe Probleme mit meiner Klasse und Funktionen aufrufen.NameError-Problem beim Versuch, eine Klassenmethode aufzurufen

speziell ..

class TriArray(): 
    triangle = read_input("inputt.txt") 
    def get_data(node): 
     return triangle[node.row][node.col] 
def main(): 
     triangle = TriArray() 

node = triangle.get_root()   #*added these to the question 
path_sum = triangle.get_data() 


def read_input(filename):   #*so you can see 
    triangle = [] 
    with open(filename, 'r') as fin: 
     rows = fin.readline() 
     for line in fin: 
      for word in rows.split(): 
       triangle.append([int(i) for i in line.split()]) 
       print(triangle) 

Fehler sagt Dreieck nicht definiert ist. wo könnte mein Fehler sein? Es gibt viele weitere Funktionen in dieser Klasse. Aber das ist der aktuelle Fehler, auf den ich stehe, Danke. Liste ist wie

[[1], 
[1 2], 
[1 2 3]] 

Wenn es relevant ..

+1

Auch habe ich verbrachte Stunden googeln und suchen. Bitte glaube nicht, dass ich sofort hierher gekommen bin, um dies zu posten. –

+1

Machen Sie ein Objekt der Klasse zuerst –

+0

Sorry, ich habe vergessen, in meiner Hauptfunktion hinzufügen Ich habe Dreieck = TriArray() –

Antwort

0
class TriArray(): 
    triangle = read_input("inputt.txt") 
    def get_data(node): 
     return triangle[node.row][node.col] 

triangle = TriArray() 
path_sum = triangle.get_data() 

dieses Versuchen

+0

Danke, aber ich habe vergessen zu erwähnen, dass in meinem Haupt habe ich Dreieck = TriArray() –

+0

@johndoe Bitte aktualisieren Sie die Frage mit voller Basiscode – Mani

0

Um eine Klassenmethode aufrufen müssen Sie es instanziiert zuerst:

path_sum = TriArray().get_data(node) 
0

Sie habe keine Instanz der Klasse erstellt. Der Klassenteil Ihres Codes definiert nur eine Klasse, aber instanziiert sie nicht.

eine Instanz erstellen von

triangle = TriArray() 

vor der letzten Zeile eingefügt wird.

Bearbeiten: In Ihrem überarbeiteten Code erstellen Sie eine Instanz in der Hauptfunktion. Diese Instanz ist jedoch außerhalb der Hauptfunktion nicht sichtbar. Sie müssen die Instanz im selben Bereich erstellen, in dem Sie sie verwenden.

0

Sie können eine Klasse wie diese definieren, das ist in Ordnung. Aber ohne eine tatsächliche Instanz der Klasse bleibt triangle ein interner Wert, der nicht außerhalb definiert ist. Deshalb gibt es eine NameError.

Basierend auf Ihren Änderungen sehen wir, dass es eine Instanziierung gibt. Aber das findet innerhalb einer main Funktion statt; die anderen Zeilen außerhalb dieser Funktion sehen es immer noch nicht. Dies bedeutet natürlich

class TriArray(): 

    def get_data(node): 
     return triangle[node.row][node.col] 

    def read_input(filename): 
     triangle = [] 
     with open(filename, 'r') as fin: 
      rows = fin.readline() 
      for line in fin: 
       for word in rows.split(): 
        triangle.append([int(i) for i in line.split()]) 
        print(triangle) 

    triangle = read_input("inputt.txt") 

def main(): 
    # let's assume node is defined and node.row = 0, node.col = 1 
    triangle = TriArray() 
    path_sum = triangle.get_data(node) # brought in from the cold 

, dass für irgendetwas passieren, können Sie die main Funktion tatsächlich aufrufen bräuchten zu:

Eine Möglichkeit ist es, die path_sum innerhalb der main Funktion zu setzen, wie hier gezeigt. Sie werden auch bemerken, dass ich read_input in die Klasse verschoben habe und bevor sie aufgerufen wird, so dass es keine NameError geben wird, wenn Sie versuchen, read_input aufzurufen.

3

Sie haben einige Probleme in Ihrem Code.

  • Sie sollten triangle wie triangle = TriArray()
  • get_data Bedürfnisse node Parameter definieren, aber Sie senden nicht.
  • Sie fehlen Selbstparameter.
  • read_input ist nicht definiert.

Sie mögen dieses Problem beheben,

class TriArray(): 
    triangle = None 

    def read_input(self): 
    with open('inputt.txt', 'r') as f: 
     self.triangle = f.read() 

    def get_data(self, node): 
    self.read_input() 
    return self.triangle[node.row][node.col] 

triangle = TriArray() 
# you have to define and sent node parameter 
# node = ?? 
path_sum = triangle.get_data(node) 
+1

Ich versuchte mein Bestes, um den Code zu reduzieren, einfach zu sein, fragte ich dies zuvor und bekam darauf hingewiesen, dass es zu lang ist. Knoten ist vorher definiert, wie auch die read_input, ich nehme an, dass ich in meiner Frage bearbeiten werde. Vielen Dank! –

Verwandte Themen