Variablen deklarieren in Methoden

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
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Ich hatte mir zu Python diesen Leitfaden durchgelesen wie Quelltexte auszusehen haben (4 Leerzeichen einrücken, wann man a=4 bzw var = 'irgendwas' schreiben soll usw.).

Was ich mich frage wie ich es bei Methoden am besten mache mit den Übergabeparametern...

Code: Alles auswählen

def myMethod(self, formular):
    form = formular
    return form
Ok, doofes Beispiel, aber wollte mal wissen wie ihr vorgeht, habt Ihr aussagekräftige Namen hier, speichert ihr es wie ich dann nochmal in einem ander anderen Variable? Könnte ja auch hingehen und "a" definieren und dann from = a machen oder so, weniger Tipparbeit... Bzw gleich mit a weiterarbeiten...

Wollte nur mal hören was Ihr da so empfehlt...
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

würmchen hat geschrieben:Was ich mich frage wie ich es bei Methoden am besten mache mit den Übergabeparametern...
direkt benutzen, ohne sie erst an andere Namen zu binden. Was wäre auch der Vorteil?
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Code: Alles auswählen

def myMethod(self, formular):
    return formular
Falls Du den Wert der Übergabeparameter in der Funktion änderst würde ich diese aber in neuen lokalen Variablen ablegen, um Übersichtlichkeit zu bewahren. Muss auch noch so ein PEP Standard dafür geben ;-)
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

hab die meiste oop Erfahrung bei Java gesammelt und wir wurden irgendwie drauf getrimmt alles nochmal in mit this.variable = anderername oder so zu schreiben... Hat mich damals schon genervt...

Wollte nur mal von erfahrenen Pythonproggern hören was die so machen
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

würmchen hat geschrieben:und wir wurden irgendwie drauf getrimmt alles nochmal in mit this.variable = anderername oder so zu schreiben...
Das hat doch eine ganz andere Bedeutung, als den Namen zu ändern. Mit "this.variable" wird das Objekt verändert, wenn du einen lokalen Namen erzeugst, dann bleibt es unverändert.

Und ich kann mir nicht vorstellen, dass euch beigebracht wurde, alles an das Objekt zu binden.
BlackJack

@würmchen: Dann hast Du denn Unterschied zwischen lokalen Variablen und Attributen nicht verstanden. Das ist in Python und Java nämlich ziemlich ähnlich. Auch in Java wird man nicht einfach so sinnlos Argumente an andere lokale Namen binden, und auch in Python musst Du ``self.name = name`` schreiben müssen um ein Argument als Attribut zu binden.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

dann versteh ich es gerade echt nicht...

Code: Alles auswählen

var = 15
def add(test):
    test += 1
    return test

add(15)
16
var
15
hier hab ich doch auch eine variable test die nur in der methode existiert und nicht meine übergebene variable ändert...

oder werf ich da gerade etwas bezüglich dem konstruktor zusammen was nich zusammen gehört.... :-( bin verwirrt
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das was du als Beispiel hast, ist eine Funktion. Von Methoden spricht man im Kontext von Klassen. Du meintest aber in deinem vorheringe Post, dass du immer "this.variable = ..." schreiben musstest. Dass entspricht in Python etwa einem:

Code: Alles auswählen

class Spam(object):
    def eggs(self, var):
        self.var = var

test = Spam()
test.eggs(1)
Wenn du das machst, dann hat "test" ein Attribut "var". Daher musstest du das sicherlich nicht immer machen, da dies für lokale Variablen total sinnlos wäre. Es ging also um den Unterschied von Attributen (Variablen gebunden an ein Objekt) und lokalen Variablen (nicht gebundenan ein Objekt).
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

bin verwirrt
jetzt schon, warte erst einmal ab.

ich habe es auch überstanden, stand vorher auch auf null. manchmal sind die lösungen hart aber herzlich.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Code: Alles auswählen

var = 15
def add(test):
    test += 1
    return test

add(15)
16
var
15
Was erwartest du hier? Warum sollte sich var hier aendern? Var hat hier doch gar nichts mit der Funktion zu tun ausser dass du zufaellig den gleichen Wert, naemlich 15, an die Funktion uebergibst.

Es hilft bei Python, an Obekte zu denken, die irgendwo im Speicher liegen und an Namen, die auf solche Objekte verweisen. test ist so ein Name, der nur lokal in der Funktion existiert. Die Objekte selbt koennen ueber das Ende der Funktion hinaus existieren. Das Objekt (genauer gesagt, eine Referenz auf das Objekt), worauf "test" verweist, wird mit bei return zurueckgegeben. Du kannst es an einen anderen Namen binden, wenn du damit weiterarbeiten willst. So etwa:

Code: Alles auswählen

bla = add(15)
Danach verweist der Name "bla" auf das Objekt, auf das in der Funktion der Name "test" verwiesen hat.

Aber warum passiert jetzt das:

Code: Alles auswählen

>>> var = 15
>>> def add(test):
...     test += 1
...     return test
...
>>> bla = add(var)
>>> print bla
16
>>> print var
15
Warum ist var hinterher noch 15? Beim Funktionsaufruf zeigen der globale Name var und der lokale Name test innerhalb der Funktion beide auf das gleiche Objekt, naemlich 15. Der Knackpunkt liegt in Zeile 3: Man kann Integer-Objekte nicht aendern, sondern bekommt bei den Rechenoperationen ein neues Integer-Objekt zurueck. In diesem Falle wuerde var weiterhin auf die 15 verweisen (wir aendern ja nicht, worauf var verweist), und test verweist jetzt auf das neue 16-Objekt, welches dann returnt wird.

Listen zum Beispiel sind aenderbar, hier bekommt man bei den Operationen kein neues Objekt zurueck, sondern aendert das existierende Objekt. Dadurch zeigen test und var die ganze Zeit auf das gleiche Objekt:

Code: Alles auswählen

>>> var = [1, 2]
>>> def add(test):
...     test += [3]
...     return test
...
>>> bla = add(var)
>>> print bla
[1, 2, 3]
>>> print var
[1, 2, 3]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

uiii mit dem add(15) hab ich mich vertippt, sollte eigentlich ein add(var) sein....

aber ok, ich denke das hab ich verstanden...
vieles davon hab ich einfach unterbewusst gemacht aber nicht wirklich kapiert....

und jetzt weiß ich auch wann man wie die variablen deklariert, an ein objekt bindet...

danke
Antworten