Seite 1 von 1

__new__ und __init__ was passiert da genau?

Verfasst: Sonntag 4. März 2007, 16:48
von Dill
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 :)

Verfasst: Sonntag 4. März 2007, 17:05
von 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!? ;-)

Verfasst: Sonntag 4. März 2007, 17:25
von Dill
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