property-Funktion mal nicht in Klassen verwenden

Hi, die meisten kennen wohl die property-Funktion aus Python, mit der man folgenden Code schreiben kann: # ----------------------------------------------------------- class Foo(object): @property def bar(self): return 1 foo = Foo() foo.bar # ----------------------------------------------------------- Ich habe mir jetzt die Frage gestellt, ob auch soetwas möglich wäre: # ----------------------------------------------------------- def bar2(self): return 42 bar = property(bar2) bar # ----------------------------------------------------------- Da ich hier frage, funktioniert der zweite Code natürlich nicht, es wird nur ein property-Objekt zurückgegeben. Gibt es da einen kleinen Trick, um das zweite Szenario (Methodenaufruf über Auslesen einer Variable) zu ermöglichen? Vielen Dank, fs

--On 8. April 2008 12:28:34 +0200 Felix Schwarz <felix.schwarz@web.de> wrote:
Hi,
die meisten kennen wohl die property-Funktion aus Python, mit der man folgenden Code schreiben kann: # ----------------------------------------------------------- class Foo(object): @property def bar(self): return 1 foo = Foo() foo.bar # -----------------------------------------------------------
Ich habe mir jetzt die Frage gestellt, ob auch soetwas möglich wäre: # ----------------------------------------------------------- def bar2(self): return 42 bar = property(bar2) bar # -----------------------------------------------------------
Da ich hier frage, funktioniert der zweite Code natürlich nicht, es wird nur ein property-Objekt zurückgegeben. Gibt es da einen kleinen Trick, um das zweite Szenario (Methodenaufruf über Auslesen einer Variable) zu ermöglichen?
@property() ausserhalb einer new-stye Klasse macht überhaupt keinen Sinn (siehe die entsprechede Doku zu property()). Wenn Du irgendwas in Art braucht, dann bastel Dir eine entsprechende Klasse, die die Zuweisung kontrolliert. Andreas

Felix, dein Beispiel macht absolut keinen Sinn. Schau mal unter http://docs.python.org/ref/descriptors.html properties koennen mithilfe des descriptor protokolls implementiert werden. Lange Rede, kurzer Sinn: properties machen nur Sinn, wenn an irgendeiner Stelle auf ein attribut (via getattr z.B. oder ueber die Punktnotation) zugegriffen wird. Stephan Am Dienstag, 8. April 2008 12:28:34 schrieb Felix Schwarz:
Hi,
die meisten kennen wohl die property-Funktion aus Python, mit der man folgenden Code schreiben kann: # ----------------------------------------------------------- class Foo(object): @property def bar(self): return 1 foo = Foo() foo.bar # -----------------------------------------------------------
Ich habe mir jetzt die Frage gestellt, ob auch soetwas möglich wäre: # ----------------------------------------------------------- def bar2(self): return 42 bar = property(bar2) bar # -----------------------------------------------------------
Da ich hier frage, funktioniert der zweite Code natürlich nicht, es wird nur ein property-Objekt zurückgegeben. Gibt es da einen kleinen Trick, um das zweite Szenario (Methodenaufruf über Auslesen einer Variable) zu ermöglichen?
Vielen Dank, fs
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On Tuesday 08 April 2008 12:28:34 Felix Schwarz wrote:
Hi,
die meisten kennen wohl die property-Funktion aus Python, mit der man folgenden Code schreiben kann: # ----------------------------------------------------------- class Foo(object): @property def bar(self): return 1 foo = Foo() foo.bar # -----------------------------------------------------------
Ich habe mir jetzt die Frage gestellt, ob auch soetwas möglich wäre: # ----------------------------------------------------------- def bar2(self): return 42 bar = property(bar2) bar # -----------------------------------------------------------
Da ich hier frage, funktioniert der zweite Code natürlich nicht, es wird nur ein property-Objekt zurückgegeben. Gibt es da einen kleinen Trick, um das zweite Szenario (Methodenaufruf über Auslesen einer Variable) zu ermöglichen?
Das ist leider nicht moeglich - wenn es auch nett waere und immer mal wieder gewuenscht wird. Ein ueblicher Trick ist halt statt eines Modules mit lauter Funktionen eine Klasse mit classmethods zu nehmen. Diez

Ich bin's nochmal. Ich nehme meine Aussage von vorhin zurueck. Was du willst macht schon Sinn. Man kann ein bisschen tricksen und z.B. folgendes machen: ---------------------------------------------------------- import sys class MyModule(object): @property def fourtytwo(self): return 42 sys.modules['MyModule'] = MyModule() import MyModule print MyModule.fourtytwo from MyModule import fourtytwo print fourtytwo -------------------------------------------------------- Allerdings muss man dann damit leben, dass man das modul als Klasse definiert und irgendwie in die sys.modules reinschmuggelt. Also nicht sehr elegant. Am Dienstag, 8. April 2008 12:28:34 schrieb Felix Schwarz:
Hi,
die meisten kennen wohl die property-Funktion aus Python, mit der man folgenden Code schreiben kann: # ----------------------------------------------------------- class Foo(object): @property def bar(self): return 1 foo = Foo() foo.bar # -----------------------------------------------------------
Ich habe mir jetzt die Frage gestellt, ob auch soetwas möglich wäre: # ----------------------------------------------------------- def bar2(self): return 42 bar = property(bar2) bar # -----------------------------------------------------------
Da ich hier frage, funktioniert der zweite Code natürlich nicht, es wird nur ein property-Objekt zurückgegeben. Gibt es da einen kleinen Trick, um das zweite Szenario (Methodenaufruf über Auslesen einer Variable) zu ermöglichen?
Vielen Dank, fs
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

--On 8. April 2008 14:00:38 +0200 Stephan Diehl <stephan.diehl@gmx.net> wrote:
Ich bin's nochmal. Ich nehme meine Aussage von vorhin zurueck. Was du willst macht schon Sinn. Man kann ein bisschen tricksen und z.B. folgendes machen: ---------------------------------------------------------- import sys
class MyModule(object):
@property def fourtytwo(self): return 42
sys.modules['MyModule'] = MyModule()
import MyModule
print MyModule.fourtytwo
from MyModule import fourtytwo
print fourtytwo --------------------------------------------------------
Allerdings muss man dann damit leben, dass man das modul als Klasse definiert und irgendwie in die sys.modules reinschmuggelt. Also nicht sehr elegant.
Das hat einen relativ hohen Pfui-Faktor :-) (will heissen: das macht man nicht). Andreas
participants (5)
-
Andreas Jung
-
Christopher Arndt
-
Diez B. Roggisch
-
Felix Schwarz
-
Stephan Diehl