Seite 1 von 1
Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 15:13
von p90
Hi,
folgendes Problem:
Sitze gerade an einem CTF (capture the flag) und habe diese Zeile vor mir:
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
Re: Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 15:19
von 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.
Re: Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 15:27
von p90
@BlackJack:
Meine Idee war halt:
Was passiert bei:
?
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...
Re: Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 16:20
von 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.
Re: Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 17:17
von p90
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?
Re: Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 17:22
von pillmuncher
p90 hat geschrieben:Also was ist der Mechanismus in Python der mir Ermöglicht M().ex zu schreiben?
Du suchst
Deskriptoren.
Re: Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 17:28
von p90
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)
Re: Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 17:42
von Hyperion
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

Re: Zugiff auf Property Funktion
Verfasst: Sonntag 23. Februar 2014, 17:52
von p90
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.