von Aussen auf Methode in Methode zugreifen

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.
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 11:29

Hallo Zusammen,

wahrscheinlich nicht möglich, aber ich möchte die Methode methode_innen von aussen benutzen. Hat da jemand eine Idee:

Code: Alles auswählen

def methode_aussen(a):
    def methode_innen(b):
        print b
    print a

methode_aussen(1).methode_innen(2)

Oder vielleicht funktioniert das mit einer inneren Klasse?

EDIT: Hab den Code nochmal geändert damit es vielelicht verständlicher ist...
Zuletzt geändert von andilar am Dienstag 21. Oktober 2008, 11:34, insgesamt 1-mal geändert.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Dienstag 21. Oktober 2008, 11:34

Meinst du Methoden (von Klassen) oder Funktionen?

"methode_innen" kannst du in "methode_aussen" einfach durch Aufruf verwenden. Ansonsten musst du, wenn du nicht tricksen willst, methode_innen zurückgeben und dann so damit etwas anfangen. Schau dir mal typische Dekoratoren an, da wird sowas oft verwendet.
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 11:37

hmm also das:

Code: Alles auswählen

def methode_aussen(a, b):
    def methode_innen(b): 
        print b
    return methode_innen(b)

methode_aussen(1,2)
meinte ich nicht, sorry

und das:

Code: Alles auswählen

def methode_aussen(a, b):
    def methode_innen(b): 
        print b
    methode_innen(b)

methode_aussen(1,2)
auch nicht.

Eher wie Methoden einer Klasse aufrufen...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 21. Oktober 2008, 11:54

``return methode_innen``?! Sowas heißt übrigens Closure.

Wenn du auf die Funktion zugreifen willst, dann musst du ihre Referend *irgendwo* speichern/zurückgeben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Dienstag 21. Oktober 2008, 11:54

Code: Alles auswählen

>>> def f(a, b):
...     def _f(b=b):
...         print b
...     print a
...     return _f
... 
>>> f(1, 555)()
1
555
Das meinte ich mit Funktion zurückgeben :)

Du könntest dann auch sowas machen:

Code: Alles auswählen

>>> f._f = f(1, 555)
1
>>> f._f()
555
Aber da man hier einer Funktion Eigenschaften verleiht, die sie so nie haben sollte, ist das eigentlich abzulehnen. Bei Klassenmethoden ist es in etwa das gleiche, nur das du gesondert self noch mit self=self übergeben müsstest.

Wozu brauchst du das?
Benutzeravatar
snafu
User
Beiträge: 5632
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 21. Oktober 2008, 11:54

Welchen Grund hat es eigentlich, dass du Funktionen in Funktionen stecken willst?
BlackJack

Dienstag 21. Oktober 2008, 11:57

@andilar: Das geht nicht, weil `methode_innen()` gar nicht existiert bis `methode_aussen()` aufgerufen wird. Und es wird auch bei jedem Aufruf von `methode_aussen()` eine *neues* Funktionsobjekt erstellt. ``def`` ist eine ausführbare Anweisung.

Warum gehen die beiden Varianten nicht, die Du selber gezeigt hast? Was für ein Problem versuchst Du da zu lösen?

Wenn Du etwas "wie Methoden einer Klassen" haben möchtest, dann verwende doch einfach Methoden einer Klasse.
Zuletzt geändert von BlackJack am Dienstag 21. Oktober 2008, 11:58, insgesamt 1-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 21. Oktober 2008, 11:57

str1442 hat geschrieben:Du könntest dann auch sowas machen:

Code: Alles auswählen

>>> f._f = f(1, 555)
1
>>> f._f()
555
Das kann man auch schon von innerhalb der Funktion ``f`` machen, da besteht kein Grund warum man ``_f`` erst zurückgeben müsste um das Attribut von außen zu setzen.

Aber ich gebe zu - sowas ist seltsam und irgendwie auch sinnlos. Closures zurückgeben kann andererseits manchmal nützlich sein.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 12:05

snafu hat geschrieben:Welchen Grund hat es eigentlich, dass du Funktionen in Funktionen stecken willst?
Die Geschichte wäre sehr lang... im Grunde kann man sagen das irgendwo in einer Datei eine bestimmte Syntax zu einem Ergebnis führen soll.
Das ist eine Anforderung die es zu erfüllen gilt:

Code: Alles auswählen

meinZaubermodul.lese_wert('vondieserStelle/hier')
meinZaubermodul.lese_wert('vondieserStelle/hier').ist_wert_gleich(10)
meinZaubermodul.schreibe_wert('andieseStelle/dort')
Der Teil meinZaubermodul ist aber schon eine Klasse, da das Objekt an andere Stelle übergeben werden muss.

Natürlich weiss ich das wenn in einer Anforderung steht (oder einem gesagt wird) das die Syntax soundso aussehen soll... Vielleicht schreibe ich doch besser eine Scriptsprache für die Scriptsprache.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 21. Oktober 2008, 12:07

Dann lass doch ``lese_wert`` eine Klasse zurückgeben, die die Methode ``ist_wert_gleich`` besitzt. :roll:
My god, it's full of CARs! | Leonidasvoice vs Modvoice
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 12:10

BlackJack hat geschrieben:Wenn Du etwas "wie Methoden einer Klassen" haben möchtest, dann verwende doch einfach Methoden einer Klasse.
Ja gerne, kann ich dabei mehrere Ebene haben? :cry:

Code: Alles auswählen

class_a().class_b().class_c()
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 12:14

Leonidas hat geschrieben:Dann lass doch ``lese_wert`` eine Klasse zurückgeben, die die Methode ``ist_wert_gleich`` besitzt. :roll:
Hmm, dann müste ich in der Methode leseWert ein Objekt einer Klasse erstellen die unter anderem den gelesenen Wert mitbringt sowie eine Methode ist_wert_gleich?
Hört sich nach Licht im Tunnel an...
Benutzeravatar
snafu
User
Beiträge: 5632
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 21. Oktober 2008, 12:23

andilar hat geschrieben:
BlackJack hat geschrieben:Wenn Du etwas "wie Methoden einer Klassen" haben möchtest, dann verwende doch einfach Methoden einer Klasse.
Ja gerne, kann ich dabei mehrere Ebene haben? :cry:

Code: Alles auswählen

class_a().class_b().class_c()
Dein Objekt "class_b" würde dann einfach die Eigenschaften und Funktionen von "class_a" übernehmen und eigene Funktionalität hinzufügen können. Und dieser Packen könnte wiederum an "class_c" übergeben werden usw. Befasse dich am besten mal mit dem Vererben von Klassen. Dann müsstest du verstehen, was ich meine.
BlackJack

Dienstag 21. Oktober 2008, 12:32

@andilar: Ich habe den Eindruck Du versuchst in einer anderen Sprache als Python zu programmieren. Dafür ist Python IMHO nicht gut geeignet, weil DSLs sich letztendlich der Python-Syntax und -Semantik unterwerfen müssen und man nur bis zu einem gewissen Grad eine andere Syntax und Semantik vortäuschen kann. Im Endeffekt wäre es sicher einfacher die Anforderungen zu ändern und einfach Python in Python zu programmieren, oder tatsächlich eine eigene DSL zu implementieren.

DSL = domain specific language
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 12:36

snafu hat geschrieben:
andilar hat geschrieben:
BlackJack hat geschrieben:Wenn Du etwas "wie Methoden einer Klassen" haben möchtest, dann verwende doch einfach Methoden einer Klasse.
Ja gerne, kann ich dabei mehrere Ebene haben? :cry:

Code: Alles auswählen

class_a().class_b().class_c()
Dein Objekt "class_b" würde dann einfach die Eigenschaften und Funktionen von "class_a" übernehmen und eigene Funktionalität hinzufügen können. Und dieser Packen könnte wiederum an "class_c" übergeben werden usw. Befasse dich am besten mal mit dem Vererben von Klassen. Dann müsstest du verstehen, was ich meine.
Also OO ist mir schon im Groben geläufig, aber die Syntax sollte ja ähnlich dem class_a().class_b().class_c() sein und das geht sinnvoller Weise nicht:

Code: Alles auswählen

class class_a(object):
    print 'class_a'
    
class class_b(class_a):
    print 'class_b'
    
class class_c(class_b):
    print 'class_c'

class_a().class_b().class_c()
Antworten