__new__ und __init__ was passiert da genau?

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
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

__new__ und __init__ was passiert da genau?

Beitragvon Dill » Sonntag 4. März 2007, 16:48

Hi,

ich habe folgende klasse:

Code: Alles auswählen

class Multiton( object ):
    def __new__(cls, key):
        print "M new"
        if not hasattr(cls, '_instances'):
            cls._instances = dict()
        if key not in cls._instances:
            cls._instances[key] = object.__new__(cls, key)
        return cls._instances[key]
    def __init__(self, key):
        print "M init"
        self.key = key


nun möchte ich eine klasse erstellen die von dieser erbt, aber mehr als einen init-parameter hat. Da ich aber in Multiton __new__ mit 2 parametern benutze, geht das schief:

Code: Alles auswählen

class Test1( Multiton ):
   
    def __init__(s, key, extra):
        pass



Ich muss also anscheinend aus der unterklasse Multiton.__new__ aufrufen:

Code: Alles auswählen

class Test2( Multiton ):
   
    def __new__(s,  key, extra):
        print "T new"
        Multiton.__new__(s, key)
   
    def __init__(s,  key, extra):
        print "T init"
        s.key=key
        s.extra=extra


dann wird aber __init__ von Test2 nicht aufgerunfen:

Code: Alles auswählen

>>> t=Test2(1, 2)
T new
M new
>>> type(t)
<type 'NoneType'>


Warum nicht?
Was passiet da genau?
... und wie macht man das? :)

danke schonmal :)
BlackJack

Beitragvon BlackJack » Sonntag 4. März 2007, 17:05

`__new__()` muss ein Objekt zurückgeben, weil das ein echter Konstruktor ist. Dein `Test2.__new__()` gibt `None` zurück. Ich vermute mal das soll nicht so sein!? ;-)
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Beitragvon Dill » Sonntag 4. März 2007, 17:25

omg ...

ich war fest davon überzeugt, dass mein code so aussieht :/

... naja, danke, jetzt gehts :)

Code: Alles auswählen

class Test2( Multiton ):
   
    def __new__(s,  key, extra):
        print "T new"
        RETURN(!) Multiton.__new__(s, key)
       
   
    def __init__(s,  key, extra):
        print "T init"
        s.key=key
        s.extra=extra

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder