Seite 1 von 1
Adresse bestimmter Funcs finden
Verfasst: Montag 14. Mai 2012, 23:03
von DaRealFreak
Joa habe aktuell das Problem mit einer ähnlichen class:
Code: Alles auswählen
class TestClass(object):
def __init__(self,skin,idx):
if skin == 3:
return
if idx == 1:
return
self.CloseSelf()
def CloseSelf(self):
print("It works")
und zwar komme ich nicht direkt an die CloseSelf Function ran, da ich in einem anderen modul bin.
D.h. ich müsste es mit testscript.TestClass(skin, idx).CloseSelf() aufrufen.
Das Problem hierbei ist, dass skin und idx je nach Begebenheiten sich verändern, d.h. einmal 2, dann 3, ...
Dann wird die Function aber ab und zu returned.
Ich möchte demnach erreichen, dass ich die Adresse ähnlich wie mit dir() die Function,... herausfinden kann und dementsprechend aufrufen kann ohne die __init__ function zu nutzen bzw zu ignorieren.
Ich sollte hierbei NICHT die bisher existierende class umschreiben.
MfG
Re: Adresse bestimmter Funcs finden
Verfasst: Montag 14. Mai 2012, 23:14
von anogayales
Ich hab zwar keine Ahnung was du da erreichen willst. Wenn du aber CloseSelf ohne eine Klasseninstanz aufrufen willst, dann musst du erstmal das self weg machen. Vor der Funktionsdefinition von CloseSelf schreibst du @staticmethod() nun kannst du via TestClass.CloseSelf() auf die Funktion zugreifen ohne das du eine Exemplar der Klasse erzeugen musst. Ein return im "Konstruktor" zu haben ist mir noch nie untergekommen. Außerdem existiert self.SelfClose() nicht.
Grüße,
anogayales
Re: Adresse bestimmter Funcs finden
Verfasst: Montag 14. Mai 2012, 23:16
von cofi
Nein das geht so nicht `CloseSelf` ist eine Methode. Methoden operieren auf einem Objekt und Objekte bekommt man indem man sie erzeugt, d.h. in dem Fall `TestClass(skin, idx)` aufruft.
Du kannst allerdings das Methoden-Objekt selbst benutzen: `TestClass.CloseSelf(TestClass(skin, idx))`. Wie man aber sehen kann braucht man dann immernoch ein Exemplar, das `self` wird hier explizit uebergeben.
Wenn du so eine Anforderung hast, bist du mit Klassen schlicht nicht bedient und willst eigentlich reine Funktionen nutzen.
Ohne die Klasse zu veraendern, kannst du zB eine Funktion schreiben, die das kapselt:
Code: Alles auswählen
def close_self(skin, idx):
TestClass(skin, idx).CloseSelf()
Aber, um das nochmal zu betonen, du solltest eigentlich nach einer anderen Loesung suchen. Also erklaer uns doch mal deine Anforderungen.
Oh und schau dir mal PEP 8 an.
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 01:19
von jerch
Dein return in __init__ und die Frage nach CloseSelf ohne Instanz sind etwas eigenartig in der derzeitigen Art&Weise eher code smell (ganz zu schweigen vom __del__). Beschreib doch mal, was Du da erreichen möchtest. Python ist sehr flexibel, auch was die Erstellung von Klassen angeht. Mit einer Beschreibung des Sachverhaltes können wir Dir sicherlich helfen.
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:00
von DaRealFreak
Die class ansich sollte so funktionieren, kurz nochmal umgeschrieben ums besser darstellen zu können.
Code: Alles auswählen
class TestClass(object):
def __init__(self,skin,idx):
if skin == 3:
return
if idx == 1:
return
self.CloseSelf()
def CloseSelf(self):
print("It works")
Ich versuche die Adresse der Function CloseSelf auf einem anderen Weg herauszufinden.
Bisher habe ich das ganze so gemacht:
Da ich aber die Parameter der Test Class nicht immer weiß, da diese polymorph sind versuche ich aus dem Prozess die Adresse zu dumpen, damit ich damit arbeiten kann ohne weiterhin die Parameter zu benötigen.
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:04
von jbs
Was hast du **eigentlich** vor?
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:36
von DaRealFreak
jbs hat geschrieben:Was hast du **eigentlich** vor?
dass ich Adressen aus dem Memory dumpe und damit dann arbeiten kann.
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:39
von jerch
Soso, Du willst die Adresse. Unter CPython geht das mit id():
Code: Alles auswählen
>>> class Foo(object):
... def bar(self):
... pass
...
>>> hex(id(Foo.bar.im_func))
'0x768500'

Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:40
von jbs
Python ist kein C(++).
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:41
von deets
@DaRealFreak
Das ist im Kontext von Python eine ziemlich unsinnige Aussage. In Python arbeitet man nicht mit "Adressen". Das ist C-Lingo.
Und von dem was du hier praesentierst wird niemandem klar, was du eigentlich erreichen willst. Und zwar auf einer hoeheren Ebene. *WAS* aber jedem klar ist, ist dass du hier gegen die Sprache arbeitest. Eine Methode ist eine Methode - die gehoert IMMER zu einem Objekt. Punkt. Wenn du den Code darin anderweitig testen willst, dann musst du anders programmieren.
Also nochmal die Frage: was willst du eigentlich - hi-level - machen? Loes dich bitte von Adresse und Co...
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:51
von DaRealFreak
deets hat geschrieben:@DaRealFreak
Das ist im Kontext von Python eine ziemlich unsinnige Aussage. In Python arbeitet man nicht mit "Adressen". Das ist C-Lingo.
Und von dem was du hier praesentierst wird niemandem klar, was du eigentlich erreichen willst. Und zwar auf einer hoeheren Ebene. *WAS* aber jedem klar ist, ist dass du hier gegen die Sprache arbeitest. Eine Methode ist eine Methode - die gehoert IMMER zu einem Objekt. Punkt. Wenn du den Code darin anderweitig testen willst, dann musst du anders programmieren.
Also nochmal die Frage: was willst du eigentlich - hi-level - machen? Loes dich bitte von Adresse und Co...
sry ist eine Gewohnheit von mir :<
Was ist machen will ist einfach die Function aufrufen ohne dass ich die zusätzlichen Parameter benötige für die init function(hier skin und idx).
Die Function läuft bereits im Hintergrund, d.h. ich müsste darauf zugreifen können, so habe ich mir das zumindest überlegt.
MfG
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:53
von jbs
Die Funktion läuft? Wie darf ich mir das vorstellen?
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:58
von jerch
@DaRealFreak:
Solange Du die "Funktion" nicht aufrufst oder in einen eigenen Thread/Prozess packst und dort startest, läuft da garnix.
Du versucht gerade, uns Dein Problem "von hinten" darzustellen, so kommen wir nicht weiter.
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 10:59
von DaRealFreak
jbs hat geschrieben:Die Funktion läuft? Wie darf ich mir das vorstellen?
Code: Alles auswählen
newmodule = process_result(compile(EtherPackOperator(modulename,'r+').GetText(),modulename,'exec'),name)
Code: Alles auswählen
def process_result(code, fqname):
is_module = isinstance(code, _ModuleType)
if is_module:
module = code
else:
module = imp.new_module(fqname)
sys.modules[fqname] = module
if not is_module:
exec code in module.__dict__
module = sys.modules[fqname]
module.__name__ = fqname
return module
so in etwa, geht noch ein bisschen weiter, aber das ist der Hauptteil.
D.h. ich müsste doch über imp irgendwie daran herankommen können oder?
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 11:15
von snafu
Wie schon gesagt wurde: Eine Referenz (was deiner Idee von Adresse wohl noch am nächsten kommt) auf eine Methode erhälst du mittels `func = TestClass.closeSelf` (beachte die ausgelassenen Klammern hinter der Methode). Diese Methode erwartet jetzt ein instanziiertes Exemplar von dieser Klasse. Anders geht es nicht. Auch "läuft" die Methode nicht einfach so im Hintergrund. Sowas komisches gibt's auch nicht in C oder C++. Deine ganze Idee ist ehrlich gesagt ziemlich wirsch. Nichts für ungut, aber bist du sicher, dass du objektorientiere Programmierung verstanden hast? Klassen die zum Testen modifiziert werden müssen kann man auch prima als abgeleitete Klasse implementieren. Aber es bleibt dabei: Solange du nichts konkretes zu deinem eigentlich Vorhaben sagst (gemeint ist nicht die dir richtig scheinende technische Realisierung), solange wird dir hier sehr wahrscheinlich auch keiner weiterhelfen können. Wie gesagt: Vergiss dein Vorhaben vom Dumpen irgendwelcher Prozesse. Du sagtest anfangs, du würdest in einem anderen Modul als in dem Modul, wo die Klasse drin ist, arbeiten - na dann importiere die Klasse doch einfach und nutze sie wie beschrieben als Basisklasse. Ich erkenne da, zumindest nach derzeitigem Kenntnisstand, kein Problem drin.
//edit: Geschrieben vor deinem letzten (direkt über "mir") stehendem Beitrag.
Re: Adresse bestimmter Funcs finden
Verfasst: Dienstag 15. Mai 2012, 11:27
von snafu
Sehe ich das richtig, dass du keinen direkt Zugriff auf den Modulcode hast, sondern ihn von einem entfernten Rechner anfordern musst? Das wäre sicherlich eine hilfreiche Zusatzinfo gewesen. Trotz alledem: Du erhälst doch offenbar ein neues Modul, dass den Code in kompilierter Form enthält, richtig? Dann kannst du doch auch auf die Klasse zugreifen, indem du einfach das entsprechende Attribut des neuen Moduls ansprichst, oder geht das nicht?