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.
Benutzeravatar
snafu
User
Beiträge: 5459
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 21. Oktober 2008, 12:41

andilar hat geschrieben:Der Teil meinZaubermodul ist aber schon eine Klasse, da das Objekt an andere Stelle übergeben werden muss.
Warunm "aber"? Eine Klasse ist in Python genau so ein Objekt wie der Rückgabewert einer Funktion. "Aber" impliziert für mich so ein bißchen, dass du darin gewisse Nachteile siehst. Nenn doch mal deine Befürchtungen und dann wird dir sicher erklärt, inwiefern sie berechtigt sind.
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 12:46

BlackJack hat geschrieben:@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
Das ist ganz meine Rede, man sollte wenn man python benutzt, auch python und die OO wie angedacht benutzen. Vielleicht hätte es aber noch eine Möglichkeit gegeben die mir als python noob verschlossen ist, daher die Fragen.

Danke.
Benutzeravatar
snafu
User
Beiträge: 5459
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 21. Oktober 2008, 12:50

andilar hat geschrieben: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
Sorry, wenn ich das sage, aber: Hä?!?

Code: Alles auswählen

class_a().class_b().class_c()
...ist doch das selbe wie:

Code: Alles auswählen

a = class_a()
b = class_b(a)
c = class_c(b)
Ansonsten reden wir wahrscheinlich aneinander vorbei.

EDIT: Um Missverständnissen vorzubeugen: Ich setze bei diesem Vergleich sein Szenario voraus, dass sozusagen Unterfunktionen anderer Objekte aufgerufen werden sollen und wollte sagen, dass man selbiges mit Vererbung erreichen kann.
Zuletzt geändert von snafu am Dienstag 21. Oktober 2008, 13:00, insgesamt 1-mal geändert.
BlackJack

Dienstag 21. Oktober 2008, 12:58

@snafu: Nein das ist nicht das selbe. Keiner der drei Aufrufe hat im ersten Beispiel ein Argument, im zweiten Übergibst Du plötzlich bei zwei Aufrufen etwas.

@andilar: Ich wollte eigentlich damit sagen, dass das was Du da mit Python versuchst höchstwahrscheinlich "unpythonisch" ist, auch wenn Du es mit OOP entsprechend hin biegst. Denn anscheinend beschreiben Deine Anforderungen wie etwas syntaktisch aus zu sehen hat. Das ist IMHO etwas merkwürdig.
Benutzeravatar
snafu
User
Beiträge: 5459
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 21. Oktober 2008, 13:08

BlackJack hat geschrieben:@snafu: Nein das ist nicht das selbe. Keiner der drei Aufrufe hat im ersten Beispiel ein Argument, im zweiten Übergibst Du plötzlich bei zwei Aufrufen etwas.
Darum ging's mir nicht. Sein "Zaubermodul" soll doch bestimmten Code aus einer anderen Datei lesen und dann in Python-Syntax übersetzen, oder nicht? Dann wäre die Syntax aus der fremden Datei (bei mir Code 1) doch mit der Python-Syntax aus meinem Code 2 erreichbar. Denn er möchte - zumindest habe ich das bisher so verstanden - letztlich eine Vererbung erreichen, die aber durch seine fremde Datei anders ausgedrückt wird.

Ich beziehe mich hier übrigens auf:
im Grunde kann man sagen das irgendwo in einer Datei eine bestimmte Syntax zu einem Ergebnis führen soll.
Das hat er zumindest noch vor circa einer Stunde gesagt.
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 13:26

Also ich weiß das das alles etwas verwirrend ist, aber im Grunde wurde meine Frage beantwortet.

Das ich bestimmte Sachen anders erreichen kann ist mir durch die diversen Ausführungen klar, aber es ging um die ganz bestimmte eine Art von Syntax und da diese nicht simpel zu erreichen ist, hat sich das ganze gelöst. Sorry.

Trotzdem vielen Dank für die Antworten. :)
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 21. Oktober 2008, 13:28

BlackJack hat geschrieben:Denn anscheinend beschreiben Deine Anforderungen wie etwas syntaktisch aus zu sehen hat. Das ist IMHO etwas merkwürdig.
Ja ist es... vielleicht wäre es pythonisch gewesen, das war was ich versucht habe herauszufinden.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 21. Oktober 2008, 14:55

andilar hat geschrieben: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:
Das geht deswegen nicht, weil bei dir die Instanzen der Klasse ``class_a`` kein Attribut ``class_b`` hat und die Instanz von ``class_b`` kein Attribut ``class_c`` hat.

Bei dir hat eben das Modul die Attribute ``class_a/b/c``.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 22. Oktober 2008, 08:45

Das Code-Objekt der inneren Funktion wird in der Liste der Konstanten der äußeren Funktion gespeichert - man weiß nur nicht mit Sicherheit, wo. Dazu muss man AFAIK den Bytecode der äußeren Funktion (steht ebenfalls im Code-Objekt) analysieren. In folgendem einfach Fall weiß ich den Index:

Code: Alles auswählen

def a():
    def b():
        return 1
    return 2
    
print eval(a.func_code.co_consts[1])
Stefan
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Mittwoch 22. Oktober 2008, 11:31

Sowas meinte ich auf Seite 1 mit "tricksen". Da greift man auf Funktions Interna die afaik nur fürs Debugging (zb Modul inspect) gedacht sind. Und das man den Index des Code Objektes kennt ist auch nur so, weil hier sieht, wo die innere Funktion definiert wird. Das führt zu magic numbering und dergleichen. Das so ziemlich einzige Funktions-Interna, das ich, wenns wirklich sein müsste, benutzen würde, wäre f.func_globals - das ist noch einigermaßen kontrollierbar.
Antworten