'Pointer' auf eine @staticmethod-function
Hi, eigentlich meinte ich es sei ganz einfach: ich weise einer Class-Variable einfach den Verweis auf eine Funktion zu, aber dann kam immer .. 'TypeError: unbound method time() must be called with A instance as first argument (got nothing instead)' Abgestrippt sieht das Ganze so aus: import time class A: time = time.time class B: @staticmethod def time(): return time.time() print A.time() A.time = B.time print A.time() Ich kann immer noch nicht sehen, wo da ein Problem ist, denn das geht:
B.time() 1215425937.687
Hat jemand 'ne Ahnung, was ich da falsch mache? Gruß, Dieter
On Monday 07 July 2008 12:21:09 Dieter Neubauer wrote:
Hi,
eigentlich meinte ich es sei ganz einfach: ich weise einer Class-Variable einfach den Verweis auf eine Funktion zu, aber dann kam immer ..
'TypeError: unbound method time() must be called with A instance as first argument (got nothing instead)'
Abgestrippt sieht das Ganze so aus:
import time
class A: time = time.time
class B: @staticmethod def time(): return time.time()
print A.time() A.time = B.time print A.time()
Ich kann immer noch nicht sehen, wo da ein Problem ist, denn das geht:
B.time()
1215425937.687
Hat jemand 'ne Ahnung, was ich da falsch mache?
class A: time = staticmethod(time.time) sollte gehen. In Python werden Funktionen auf Klassen durch das Descriptorprotokoll gejagt. Das passiert nach dem Klassenstatement, und damit wird time in A oben eben auch zu einer "normalen" methode. Alternativ geht class A: pass A.time =time.time Diez
Diez B. Roggisch schrieb:
On Monday 07 July 2008 12:21:09 Dieter Neubauer wrote:
Hi,
eigentlich meinte ich es sei ganz einfach: ich weise einer Class-Variable einfach den Verweis auf eine Funktion zu, aber dann kam immer ..
'TypeError: unbound method time() must be called with A instance as first argument (got nothing instead)'
Abgestrippt sieht das Ganze so aus:
import time
class A: time = time.time
class B: @staticmethod def time(): return time.time()
print A.time() A.time = B.time print A.time()
Ich kann immer noch nicht sehen, wo da ein Problem ist, denn das geht:
B.time()
1215425937.687
Hat jemand 'ne Ahnung, was ich da falsch mache?
class A: time = staticmethod(time.time)
sollte gehen.
In Python werden Funktionen auf Klassen durch das Descriptorprotokoll gejagt. Das passiert nach dem Klassenstatement, und damit wird time in A oben eben auch zu einer "normalen" methode.
Alternativ geht
class A: pass
A.time =time.time
Diez
Leider geht das nicht (habs probiert)! Im Skript funktioniert ja auch noch das erste 'print A.time()'. Erst nachdem 'A.time = B.time' zugewiesen wurde gibt's den Fehler und das wo B.time als staticmethod gekennzeichnet ist! Dieter
Leider geht das nicht (habs probiert)!
import time class A: pass A.time = time.time print A.time() Genau das geht bei mir, python2.5
Im Skript funktioniert ja auch noch das erste 'print A.time()'. Erst nachdem 'A.time = B.time' zugewiesen wurde gibt's den Fehler und das wo B.time als staticmethod gekennzeichnet ist!
Achso, das wurde aus deiner Beschreibung nicht ganz klar. Es scheint so zu sein dass das, was B.time zurueckgibt das Descriptor-protocol unterstuetzt - und dabei dann ein "normaler" methoden-descriptor wird, statt weiterhin staticmethod zu sein. Was geht ist natuerilch A.time = staticmethod(B.time) Diez
Diez B. Roggisch schrieb:
Im Skript funktioniert ja auch noch das erste 'print A.time()'. Erst nachdem 'A.time = B.time' zugewiesen wurde gibt's den Fehler und das wo B.time als staticmethod gekennzeichnet ist!
Achso, das wurde aus deiner Beschreibung nicht ganz klar.
Es scheint so zu sein dass das, was B.time zurueckgibt das Descriptor-protocol unterstuetzt - und dabei dann ein "normaler" methoden-descriptor wird, statt weiterhin staticmethod zu sein.
Was geht ist natuerilch
A.time = staticmethod(B.time)
Stimmt - das geht wirklich! Die Systematik, die dahinter steckt kann ich nicht ganz erkennen! Irgendeinen Grund wird es wohl geben, dass aus der static-Function auf 'magische' Weise wieder ein methoden-descriptor wird, vielleicht auch nur ein Relikt aus der Zeit vor 'staticmethod'? Danke für den Tip - ich werde jetzt eben doppelt gemoppelt arbeiten. Schade nur, dass ich damit Wissen über Implementierungsdetails einbaue, was an sich ja nicht notwendig wäre .. Dieter
--On 7. Juli 2008 12:21:09 +0200 Dieter Neubauer <neubauer@lni.de> wrote:
Hi,
eigentlich meinte ich es sei ganz einfach: ich weise einer Class-Variable einfach den Verweis auf eine Funktion zu, aber dann kam immer ..
'TypeError: unbound method time() must be called with A instance as first argument (got nothing instead)'
Abgestrippt sieht das Ganze so aus:
import time
class A: time = time.time
class B: @staticmethod def time(): return time.time()
Das geht doch nur mit new-style Classes? Andreas
Hi, Dieter Neubauer wrote:
import time
class A: time = time.time
class B: @staticmethod def time(): return time.time()
print A.time() A.time = B.time print A.time()
Warum machst du nicht einfach def gettime(): return time.time() class A: time = time.time class B: time = gettime ? Ich gehe mal davon aus, dass dein Code oben nur ein Beispiel ist und from time import time class B: time = time dein Problem nicht löst. Stefan
participants (4)
-
Andreas Jung -
Dieter Neubauer -
Diez B. Roggisch -
Stefan Behnel