Django und Klassenvariablen
Nochmal eine Frage, wenn ich den Code mit hasattr ausstatte, dann funktioniert das nicht. Kann es sein das man hasattr nicht mit self benutzen kann?
Die Testausgabe lautet immer:
Er sollte beim zweiten Mal ja "Old value..." hinschreiben, oder etwa nicht?
Und warum schreibt er die Ausgabe immer 2 mal hin?
Code: Alles auswählen
def __get_uptime(self):
"""return uptime in a human readable format"""
if hasattr(self, '__uptime'):
print "old value..."
return self.__uptime
print "No uptime defined, getting new one..."
tmp = int(snmp_val(_defaultcfg.ip, _defaultcfg.snmp_community,
_defaultcfg.uptime_mib.oid + str(self.cur_id) + ".0", 1))
if not tmp:
self.__uptime = "00:00:00"
else:
div, mod = divmod(tmp, 8640000)
div, mod = divmod(mod, 360000)
uptime_str = '%d:' % div
div, mod = divmod(mod, 6000)
uptime_str += '%02d:' % div
div, mod = divmod(mod, 100)
uptime_str += '%02d' % div
self.__uptime = uptime_str
return self.__uptime
uptime = property(__get_uptime)
Code: Alles auswählen
In [7]: a.uptime
No uptime defined, getting new one...
No uptime defined, getting new one...
Out[7]: '10:17:36'
In [8]: a.uptime
No uptime defined, getting new one...
No uptime defined, getting new one...
Out[8]: '10:17:36'
Und warum schreibt er die Ausgabe immer 2 mal hin?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ich würde sagen, das ist schon die richtige Lösung. Nur must du mit args und kwargs arbeiten und die eigentliche __init__ Methode mit super() aufrufen. Dann sollte das gehen, denke ich...TheGrudge hat geschrieben:Code: Alles auswählen
def __init__(self, uptime=0): self.uptime = uptime
Jetzt habe ich nochmal was probiert und kapiere mal wieder nicht was das sein soll.
Ich habe nun tmp einfach mal weggelassen, damit ich mal testen kann was passiert wenn der Benutzer eigentlich nicht eingewählt ist. Sollte ja funktionieren, aber es kommt:
Wieso sucht er denn nach einer globalen tmp? Ich kann doch sonst auch einfach sagen, gucke ob Variable da (if tmp) und dann sagt Python immer False falls nicht vorhanden. Liegt das daran das es als Property zugewiesen wurde?
Code: Alles auswählen
def __get_uptime(self):
"""return uptime in a human readable format"""
if not tmp:
return "00:00:00"
div, mod = divmod(tmp, 8640000)
div, mod = divmod(mod, 360000)
uptime_str = '%d:' % div
div, mod = divmod(mod, 6000)
uptime_str += '%02d:' % div
div, mod = divmod(mod, 100)
uptime_str += '%02d' % div
return uptime_str
uptime = property(__get_uptime)
Code: Alles auswählen
146 # tmp = int(snmp_val(_defaultcfg.ip, _defaultcfg.snmp_community,
147 # _defaultcfg.uptime_mib.oid + str(self.cur_id) + ".0", 1))
--> 148 if not tmp:
149 return "00:00:00"
150 div, mod = divmod(tmp, 8640000)
<type 'exceptions.NameError'>: global name 'tmp' is not defined
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hm. Da ist wohl "removing magic" noch nicht so ganz durchgedrungenTheGrudge hat geschrieben:Nein das geht leider nicht und wird auch von den Django-Entwicklern nicht empfohlen, da in der __init__ soviel Magic passiert das es dann nicht mehr geht.

Wie wäre es mit __new__?
Kannst du nicht. Es kommt ein NameError.TheGrudge hat geschrieben:Ich kann doch sonst auch einfach sagen, gucke ob Variable da (if tmp) und dann sagt Python immer False falls nicht vorhanden.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
IMHO ging das noch nie 
Mach mal ein mini Skript und starte es:
Wenn tmp vorher nicht initialisiert wurde erhälst du:
Nachsehen ob tmp im lokalen Namensraum ist...
Also so:

Mach mal ein mini Skript und starte es:
Code: Alles auswählen
if tmp: pass
Man könnte das vielleicht so machen:NameError: name 'tmp' is not defined
Code: Alles auswählen
if "tmp" in locals(): pass
Also so:
Code: Alles auswählen
#~ tmp = True
if locals().get("tmp", None):
print "OK"
Jaja ich bin irgendwie nicht ganz dabei im Moment...
Natürlich ging es noch nie, ich habe es ja immer so getestet:
Dadurch wird ja tmp zugewiesen, im "schlimmsten Fall" mit None und dadurch existiert sie. Oh man...

Natürlich ging es noch nie, ich habe es ja immer so getestet:
Code: Alles auswählen
tmp = irgendwas()
if tmp:
mach_das_hier()
Vielleicht solltest Du einfach in das *Model* nicht zuviel Logik reinstecken wollen. Ich würde solche Objekte die an einem ORM hängen eher als Datenobjekte betrachten und die Arbeit in einen Controller verlegen. Insbesondere wenn man bei den Model-Objekten so leicht in Konflikt mit der "Magie" des Frameworks in Konflikt gerät.
http://de.wikipedia.org/wiki/MVC
http://de.wikipedia.org/wiki/MVC
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Doch. Aber nicht mit mangled Names:TheGrudge hat geschrieben:Nochmal eine Frage, wenn ich den Code mit hasattr ausstatte, dann funktioniert das nicht. Kann es sein das man hasattr nicht mit self benutzen kann?
__foo wird zu _ClassName__foo. Und das muss man mit getattr/hasattr manuell schreiben.
TUFKAB – the user formerly known as blackbird