Zugiff auf Property Funktion

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
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,
folgendes Problem:
Sitze gerade an einem CTF (capture the flag) und habe diese Zeile vor mir:

Code: Alles auswählen

(a, b) = pickle.loads(U)
U kann ich beliebig manipulieren.
Ich möchte nun meinen eigenen Code einfügen.
Meine Idee war so was:

Code: Alles auswählen

class M(object):
    @property
    def ex(self):
        #my code
        return 5
U = (M().ex, 1) 
Nun soll aber M().ex noch nicht ausgewertet werden sondern beim
entpacken der Tuple.
Hat da jemand Ideen für mich?

p91
BlackJack

@p90: Löse es anders, denn bei der Zuweisung sehe ich keine Möglichkeit das automatisch zu machen. Objekte bekommen nicht mit wenn sie aus einem Tupel geholt werden oder wenn sie an einen Namen gebunden werden.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

@BlackJack:

Meine Idee war halt:
Was passiert bei:

Code: Alles auswählen

a = M().ex
?
M().ex muss ja nicht wissen, dass es aus einer Tupel genommen wird, ich muss halt in die
Tuple das packen was sonst bei dem a = M().ex passiert.

Hm, vlt. muss ich einfach mehr darüber Wissen was bei @property passiert...
BlackJack

@p90: Dabei wird ein Objekt vom Typ `M` erzeugt und darauf die `ex()`-Methode aufgerufen und das Ergebnis wird an `a` gebunden. Also das gleiche was bei ``M().ex()`` passieren würde wenn Du das nicht zum Property machst. Das „was sonst” dabei passiert kannst Du nicht in das Tupel packen. Du kannst höchstens eine Funktion in das Tupel packen die das Property abfragt wenn sie aufgerufen wird. Die musst Du nach dem entpacken des Tupels dann aber auch explizit aufrufen um den Wert zu bekommen — automagisch geht das nicht.

Und sollte das Tupel aus dem Beispiel welches Du an `U` bindest eigentlich irgendwann mal so erstellt und dann gepickelt worden sein, dann steht in der gepickleten Datei als erstes Element in dem Tupel eine 5 und es gibt keine möglichkeit mehr heraus zu finden mit welchem `M`-Objekt die irgendwann mal erzeugt wurde.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hm, das ist natürlich doof.

Noch eine Frage dazu:

Warum reicht bei einer property der Aufruf von M().ex statt M().ex()?
Also was ist der Mechanismus in Python der mir Ermöglicht M().ex zu schreiben?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

p90 hat geschrieben:Also was ist der Mechanismus in Python der mir Ermöglicht M().ex zu schreiben?
Du suchst Deskriptoren.
In specifications, Murphy's Law supersedes Ohm's.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

pillmuncher hat geschrieben:
p90 hat geschrieben:Also was ist der Mechanismus in Python der mir Ermöglicht M().ex zu schreiben?
Du suchst Deskriptoren.
Danke! Werde ich mir mal genauer durchlesen müssen.

Hab für mein momentanes Problem bereits eine Lösung indem man __iter__ überschreibt und
somit eigenen Code ausführen kann.

Code: Alles auswählen

class ExploitTuple:
	def __init__(self, values=None):
		if values is None:
			self.values = []
		else:
			self.values = values

	def __iter__(self):
		print("I got you")
		return iter(self.values)

U = ExploitTuple([1,2])

(a,b) = U

print(a)

Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

p90 hat geschrieben: Warum reicht bei einer property der Aufruf von M().ex statt M().ex()?
Damit es nicht "verpufft": Das ist ja gerade der Witz an Properties! Der Zugriff ist nach außen exakt mit dem Zugriff auf ein Attribut eines Objektes; d.h. Du kannst die Interna einer Klasse auch nachträglich ändern, ohne dass sich am API etwas ändert :-)

In Sprache wie Java oder C++ musst Du entweder von vornherein auf Getter und Setter setzen, wenn Du noch nicht weißt, ob Du mal Logiken beim Setzen oder Auslesen eines Attributes brauchst, oder aber später API-Änderungen in Kauf nehmen. Dank Properties braucht man sich darüber in anderen Sprachen - wie eben Python - keine Gedanken machen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hyperion hat geschrieben:
p90 hat geschrieben: Warum reicht bei einer property der Aufruf von M().ex statt M().ex()?
Damit es nicht "verpufft": Das ist ja gerade der Witz an Properties! Der Zugriff ist nach außen exakt mit dem Zugriff auf ein Attribut eines Objektes; d.h. Du kannst die Interna einer Klasse auch nachträglich ändern, ohne dass sich am API etwas ändert :-)

In Sprache wie Java oder C++ musst Du entweder von vornherein auf Getter und Setter setzen, wenn Du noch nicht weißt, ob Du mal Logiken beim Setzen oder Auslesen eines Attributes brauchst, oder aber später API-Änderungen in Kauf nehmen. Dank Properties braucht man sich darüber in anderen Sprachen - wie eben Python - keine Gedanken machen :-)
Hi,
warum es ein solches Konstrukt gibt war mir schon klar.
Meine Frage war eher wie Python zwischen einer Property bei der ja eine Funktion ausgeführt werden muss und einer "normalen" variable unterscheidet.
Antworten