Problem beim Aufruf eines Klassenattributs

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zett
User
Beiträge: 9
Registriert: Samstag 26. Januar 2013, 00:01

Ich habe folgenden Code:

Code: Alles auswählen

class Test():
    def __init__(self,x=0,y=0):
        self.x=x
        self.y=y
    def Ändern(self):   #werte sollen in der Form angegeben werden: Variable Zahl zb. x5 y376
        Wert_neu=input("Neuen Wert eingeben:")
        if Wert_neu[0]=="x":
            self.x+=int(Wert_neu[1:])
        elif Wert_neu[0]=="y":
            self.y+=int(Wert_neu[1:])
        else:
            print("Falsches Eingabeformat")
        self.Ausgabe()

    def Ausgabe(self):
        print("x = {}, y = {}".format(self.x,self.y))
Mein Problem liegt in der Ändern-Methode beim aufruf von self.x oder .y .
Mit den if, elif funktioniert das auch so, wenn hier aber mehr Variablen hinzukommen wird die elif-liste ja immer länger.
Also hab ich versucht den Aufruf zu Ändern:

Code: Alles auswählen

self.Wert_neu[0]+=int(Wert_neu[1:])
so bekomme ich nen ValueError weil er denkt .Wert_neu wäre ein Attribut.
Mit str(Wert_neu[0]) gehts auch nicht.

Gibts da irgendeine Möglichkeit den Aufruf zusammenzusetzen?
BlackJack

@Zett: Du suchst entweder die `setattr()`-Funktion, oder Du möchtest den Ansatz noch mal überdenken.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Vielleicht suchst du auch dict()

Xe
Zett
User
Beiträge: 9
Registriert: Samstag 26. Januar 2013, 00:01

Das mit dem setattr() hat ganz gut geklappt:

Code: Alles auswählen

setattr(self,Wert_neu[0],int(getattr(self,Wert_neu[0]))+ int(Wert_neu[1:]))
So wird der neu Wert zu dem alten addiert.
BlackJack

@Zett: Man muss allerdings noch aufpassen, dass es eine Ausnahme gibt, wenn der Benutzer ein nicht-existierendes Attribut angibt. Ausserdem scheint mir da ein `int()` zu viel zu sein.
Zett
User
Beiträge: 9
Registriert: Samstag 26. Januar 2013, 00:01

So, jetzt die verbesserte Version:

Code: Alles auswählen

class Test():
    def __init__(self,a=0,b=0,c=0):
        self.a=a
        self.b=b
        self.c=c
        self.Attribute=["a","b","c"]
        
    def Ändern(self):
        while True:
            Wert_neu=input("Neuen Wert eingeben:")
                      
            if Wert_neu=="":
                break
            elif Wert_neu[0] in self.Attribute:
                try:
                    Zahlenwert=float(Wert_neu[1:])
                except ValueError:
                    print("Eingabeformat beachten")
                    print("")
                    continue
                setattr(self,Wert_neu[0],getattr(self,Wert_neu[0])
                        + Zahlenwert)
            else:
                print("Kein gültiges Klassenattribut")
                print("")
                
            self.Ausgabe()
        
    def Setzen(self):
        Wert_neu=input("Neuen Wert eingeben:")
        setattr(self,Wert_neu[0],float(Wert_neu[1:]))
        self.Ausgabe()
        
    def Ausgabe(self):
        print("a = {}, b = {}, c= {}".format(self.a,self.b,self.c))
Diese gibt ne Meldung wenn, versucht wird ein nicht vorhandenes Attribut zu ändern oder das Eingabeformat nicht stimmt.
Ausserdem hab ich die Werte-Eingabe in eine while-Schleife gesetzt die mann durch einen leeren String verlässt (Enter).

Mit der einen Integerumwandlung hattest du recht BlackJack, getattr() brauch das nicht.
Zuletzt geändert von Zett am Montag 29. April 2013, 10:16, insgesamt 1-mal geändert.
BlackJack

@Zett: Wird denn jemals von aussen auf die Attribute `a`, `b`, oder `c` zugegriffen? Wenn nicht, dann wäre ein `dict` vielleicht die bessere Lösung.
Zett
User
Beiträge: 9
Registriert: Samstag 26. Januar 2013, 00:01

Ein praktischen nutzen hat das an und für sich garnich.
Ich lerne nur wie das alles funktioniert.
Verwenden könnte man das eventuell in der Form:
Dreieck=Test()
Dreieck."Irgendeine Funktion"

Da müssen natürlich noch nen paar Funktionen in die Klasse die dann auch was ausrechnen.
Das ginge sicher auch einfacher irgendwie, aber das is ja auch ne Übung für mich.
Antworten