property-Funktion mal nicht in Klassen verwenden
![](https://secure.gravatar.com/avatar/ecada34427733b78c41041266a0bb389.jpg?s=120&d=mm&r=g)
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
![](https://secure.gravatar.com/avatar/63291a304566cbe5062a0e92da2ab883.jpg?s=120&d=mm&r=g)
--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
![](https://secure.gravatar.com/avatar/c1bd6782daa0b5e9aee91ce1f53b54a1.jpg?s=120&d=mm&r=g)
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
![](https://secure.gravatar.com/avatar/7c27e514504f90a63edaefd74248a461.jpg?s=120&d=mm&r=g)
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
![](https://secure.gravatar.com/avatar/c1bd6782daa0b5e9aee91ce1f53b54a1.jpg?s=120&d=mm&r=g)
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
![](https://secure.gravatar.com/avatar/63291a304566cbe5062a0e92da2ab883.jpg?s=120&d=mm&r=g)
--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