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

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

`__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

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 
Antworten