Seite 1 von 1

Problem beim Aufruf eines Klassenattributs

Verfasst: Sonntag 28. April 2013, 06:48
von Zett
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?

Re: Problem beim Aufruf eines Klassenattributs

Verfasst: Sonntag 28. April 2013, 08:16
von BlackJack
@Zett: Du suchst entweder die `setattr()`-Funktion, oder Du möchtest den Ansatz noch mal überdenken.

Re: Problem beim Aufruf eines Klassenattributs

Verfasst: Sonntag 28. April 2013, 08:57
von xeike
Vielleicht suchst du auch dict()

Xe

Re: Problem beim Aufruf eines Klassenattributs

Verfasst: Montag 29. April 2013, 07:19
von Zett
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.

Re: Problem beim Aufruf eines Klassenattributs

Verfasst: Montag 29. April 2013, 07:31
von 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.

Re: Problem beim Aufruf eines Klassenattributs

Verfasst: Montag 29. April 2013, 09:16
von Zett
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.

Re: Problem beim Aufruf eines Klassenattributs

Verfasst: Montag 29. April 2013, 10:15
von 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.

Re: Problem beim Aufruf eines Klassenattributs

Verfasst: Montag 29. April 2013, 10:25
von Zett
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.