Das ist meine Klasse:

class variable(object):
    def __init__(self, name, name_alias, parents,values,table):
    #name of the variable
    self.name = ""

Dies ist die Funktion mit Problemen:

F ist eine Datei .txt-Datei (geöffnet in "Hauptfunktion")

def read_problem(f):
    list_of_variables=[]
    entry=0;

    for line in f:
        words = line.split()

        #enters only if it's not a comment
        if (words[0]!='#'):

            if (words[0]=="VAR"):
                x=variable;
            elif (words[0]=="name"):
                x.name=words[1]
                list_of_variables.append(x)

    for i in range(len(list_of_variables)):
        print(list_of_variables[i].name)
    return

Meine TXT-Datei lautet:

VAR
name MaryCalls
VAR
name JohnCalls
VAR
name Burglary
VAR
name Earthquake
VAR
name Alarm

Was ich in diesem Druck (und damit in der Liste) bekomme, ist:

Alarm

Alarm

Alarm

Alarm

Alarm

Aber ich wollte haben:

MaryCalls

JohnCalls

Einbruch

Erdbeben

Alarm

Was ist los mit dir? Warum ändern sich alle vorherigen Einträge der Liste?

Vielen Dank!

-1
Carollour 8 Dez. 2013 im 19:35

3 Antworten

Beste Antwort

In der Zeile x=variable bezieht sich x auf die Klasse variable. Sie erstellen niemals Instanzen dieser Klasse, sondern ändern wiederholt eine Variable auf Klassenebene name.

Am Ende des Programms, wenn Sie drucken, wird variable.name natürlich der letzte Wert zugewiesen, in diesem Fall 'Alarm'.

Sie werden dies sehen, wenn Sie print(list_of_variables) tun:

[<class '__main__.variable'>, <class '__main__.variable'>, 

Etc.

Ändern Sie x = variable in x = variable() und Sie werden sehen (zum Beispiel):

[<__main__.variable object at 0x6ffffee65d0>, <__main__.variable object at 0x6ffffee6610>

Etc.

4
Steve Jessop 8 Dez. 2013 im 15:42

Das Hauptproblem besteht darin, dass der Code, wenn er eine Zeile erkennt, die mit "VAR" beginnt, die Klassenvariable x zuweist, nicht einer Instanz der Klasse. Dazu müssen Sie die Klasse aufrufen, die am Ende die Methode '__init__() der Klasse aufruft, falls vorhanden. Mit freundlichen Grüßen, aber es werden 5 Argumente erwartet, von denen zum Zeitpunkt der Erstellung keines bekannt ist.

In einem solchen Fall ist es am einfachsten, jedem Argument einen Standardwert zuzuweisen, der bedeutet, dass "noch kein Wert vorhanden ist", und diese der zu erstellenden Instanz zuzuweisen (self).

Folgendes meine ich:

class Variable(object):
    def __init__(self, name="", name_alias="", parents=None, values=None, 
                 table=None):
        self.name = name
        self.name_alias = name_alias
        self.parents = parents
        self.values = values
        self.table = table

def read_problem(f):
    list_of_Variables=[]

    for line in f:
        words = line.split()

        # if not a comment
        if words[0] != '#':
            if words[0] == "VAR":
                x = Variable()  # construct empty Variable
            elif words[0] == "name":
                x.name = words[1]
                list_of_Variables.append(x)

    for var in list_of_Variables:
        print(var.name)
    return

def main():
    filename = 'variables.txt'
    with open(filename) as f:
        read_problem(f)

main()
0
martineau 8 Dez. 2013 im 16:11

1) Wenn Sie den Namen im Konstruktor von variable initialisieren möchten, müssen Sie die Zuordnung weiter einrücken.

def __init__(self, name, name_alias, parents,values,table):
    #name of the variable
    self.name = ""

2) Ihr Hauptproblem ist, dass Sie mit dieser Zeile eine neue Instanz von variable erstellen möchten:

x=variable;

Du musst schreiben:

x = variable();
2
Max Truxa 10 Dez. 2013 im 22:36