2016-04-14 2 views
2

Problèmes spécifiques liés à l'utilisation d'une classe et à son appel. C'est le chemin le plus haut d'un programme triangle .. mais j'ai des problèmes avec mes fonctions de classe et d'appel.Problème Problème d'erreur lors de la tentative d'appel d'une méthode de classe

spécifiquement ..

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) 

erreur est dire triangle n'est pas défini. où pourrait être mon erreur? Il y a beaucoup plus de fonctions dans cette classe. Mais c'est l'erreur actuelle sur laquelle je suis, Merci. liste est comme

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

si son correspondant ..

+1

Aussi j'ai passé des heures googler et la recherche. S'il vous plaît ne pense pas que je viens juste de venir ici pour poster ceci. –

+1

Faire d'abord un objet de la classe –

+0

Désolé, j'ai oublié d'ajouter dans ma fonction principale J'ai triangle = TriArray() –

Répondre

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() 

Essayez cette

+0

Merci, mais j'ai oublié de mentionner que dans mon principal j'ai triangle = TriArray() –

+0

@johndoe S'il vous plaît mettre à jour la question avec le code de base complet – Mani

0

Pour appeler une méthode de classe vous devez instancier première:

path_sum = TriArray().get_data(node) 
0

Vous n'ont pas créé une instance de la classe. La partie de classe de votre code définit uniquement une classe, mais ne l'instancie pas.

Créer une instance en insérant

triangle = TriArray() 

avant la dernière ligne. Editer: dans votre code révisé, vous créez une instance dans la fonction principale. Cependant, cette instance n'est pas visible en dehors de la fonction principale. Vous devez créer l'instance à la même portée que celle où vous l'utilisez.

0

Vous pouvez définir une classe comme celle-ci, c'est bien. Mais sans une instance réelle de la classe, triangle restera une valeur interne qui n'est pas définie à l'extérieur. C'est pourquoi il y a un NameError.

En fonction de vos modifications, nous voyons qu'il existe une instanciation. Mais cela se passe à l'intérieur d'une fonction main; les autres lignes en dehors de cette fonction ne le voient toujours pas.

Une façon est de mettre le path_sum dans la fonction main, comme indiqué ici:

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 

Cela signifie, bien sûr, que pour tout ce qui arrive, vous auriez besoin d'invoquer effectivement la fonction main. Vous remarquerez également que j'ai déplacé read_input dans la classe et avant qu'elle ne soit invoquée, de sorte qu'il n'y aura pas de NameError en essayant d'appeler read_input.

3

Vous avez des problèmes avec votre code.

  • Vous devez définir triangle comme triangle = TriArray()
  • get_data besoins paramètre node mais vous n'êtes pas envoyer.
  • Il vous manque un paramètre automatique.
  • read_input n'est pas défini.

Vous pouvez fixer comme ça,

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

J'ai essayé de mon mieux pour réduire le code pour être simple, je l'ai demandé avant répété pour cela étant trop long. Node est défini comme le read_input, je suppose que je vais modifier dans ma question. Merci! –