Loop mit __new__

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ein anderer Vorschlag:

Code: Alles auswählen

In [100]: class Klob(object):
   .....:     def __init__(self, folge=31415926535):
   .....:         self.folge = folge
   .....:     def __str__(self):
   .....:         return 'Klob(%s)' % self.folge
   .....:     
   .....:     

In [101]: klob = Klob()

In [102]: print klob
Klob(31415926535)

In [103]: klob = Klob(folge=123)

In [104]: print klob
Klob(123)
EDIT: Blödsinn durch kurzfristigen Gehirnaussetzer entfernt.
Zuletzt geändert von snafu am Dienstag 17. Februar 2009, 17:11, insgesamt 1-mal geändert.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Kann man dann nicht auch einfach die Folge im Falle von ``not folge``als Defaultparameter setzen, anstatt des If-Konstruktes?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nocta hat geschrieben:Kann man dann nicht auch einfach die Folge im Falle von ``not folge``als Defaultparameter setzen, anstatt des If-Konstruktes?
Natürlich, siehe EDIT. Das mache ich eigentlich auch immer so. War vielleicht verwirrt von den ganzen Konstrukten des OP's. ;P

Das neue Objekt würde ich mir dann übrigens so machen:

Code: Alles auswählen

In [145]: Newklob = lambda: klob

In [146]: newklob = Newklob()
Der Sinn des ganzen bleibt mir weiterhin ein Rätsel...
Goswin hat geschrieben:Bei speicherdatei==None soll das Objekt neu erzeugt werden, was zeitraubend ist. Bei speicherdate<>None wird es mit Hilfe des Pickle-Moduls schnell wiederhergestellt. Um das zu realisieren, benutze ich derzeit eine Fabrikfunktion.
Kann die Fabrikfunktion nicht nach der Prüfung auf Existenz der Speicherdatei direkt entscheiden ob sie das Pickle-File lädt oder das Objekt neu erzeugt? Ich verstehe wie gesagt nicht warum man den Umweg über einen String gehen muss. Wenn du nur den Befehl zur Initialisierung an einen Namen zur späteren Verwendung binden willst, dann nutze - wie gezeigt - ein Lambda-Konstrukt als Rückgabewert der Fabrikfunktion. Natürlich übergibst du lambda dann keinen String sondern direkt den Befehl. Er wird ja dann noch nicht ausgeführt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Goswin hat geschrieben:alle Argumente von "object.__new__" außer dem ersten werden verworfen.
Nein, das Problem ist einfach, dass __init__ mit den selben Argumenten wie __new__ aufgerufen wird (siehe Beschreibung von __new__ in der Doku), deswegen gibt es bei Klob() einen Fehler, da __init__ zwei Argumente erwartet.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Also fuer mich sieht das alles so aus, als wuerde jemand versuchen, javaartig Python zu programmieren, indem er denjenigen, der die Klasse benutzt einschraenkt.

Ich mein, wenn man zur Integritaetssicherung der Klasse unbedingt jeden Wert sichern will, kann man das auch einfach so machen:

Code: Alles auswählen

class Test(object):
    def __init__(self, val=345):
        self.val = val if isinstance(val, int) else 345

    def __repr__(self):
        return '<Test with value of %i>' %self.val

Code: Alles auswählen

In [31]: Test()
Out[31]: <Test with value of 345>

In [32]: Test(None)
Out[32]: <Test with value of 345>

In [33]: Test("foo")
Out[33]: <Test with value of 345>
Ich weiß, dass hilft dir jetzt nichts bei der Ideenfindung zum Thema __new__, aber ich wuerde mich einfach damit abfinden, dass man es wirklich *seltenst* braucht ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Goswin hat geschrieben:alle Argumente von "object.__new__" außer dem ersten werden verworfen.
Darii hat geschrieben:Nein, das Problem ist einfach, dass __init__ mit den selben Argumenten wie __new__ aufgerufen wird (siehe Beschreibung von __new__ in der Doku), deswegen gibt es bei Klob() einen Fehler, da __init__ zwei Argumente erwartet.

Code: Alles auswählen

if not "Argumente von object.__new__ nach dem ersten werden verworfen": verwerfe_Doku()
Siehe Martelli, Python in a Nutshell, 2.Auflage, Seite 88 unten.
Antworten