Seite 1 von 1
Variablen deklarieren in Methoden
Verfasst: Mittwoch 14. Mai 2008, 09:42
von würmchen
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...
Re: Variablen deklarieren in Methoden
Verfasst: Mittwoch 14. Mai 2008, 09:58
von keppla
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?
Verfasst: Mittwoch 14. Mai 2008, 10:03
von Toni83
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

Verfasst: Mittwoch 14. Mai 2008, 10:05
von würmchen
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
Verfasst: Mittwoch 14. Mai 2008, 10:10
von EyDu
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.
Verfasst: Mittwoch 14. Mai 2008, 10:11
von 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.
Verfasst: Mittwoch 14. Mai 2008, 10:23
von würmchen
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
Verfasst: Mittwoch 14. Mai 2008, 10:28
von EyDu
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).
Verfasst: Mittwoch 14. Mai 2008, 10:30
von sechsrad
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.
Verfasst: Mittwoch 14. Mai 2008, 11:35
von Rebecca
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:
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]
Verfasst: Mittwoch 14. Mai 2008, 11:42
von würmchen
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