Warum wird __init__ nicht aufgerufen, wenn __new__ ohne Argumente aufgerufen wird

7

Ich versuche ein Objekt zu erstellen (nicht genau wiederherzustellen), dessen Attribute in einer Datenbank gespeichert sind. Daher möchte ich __init__ nicht aufrufen. Dieser Wunsch scheint mit in Verbindung zu stehen, die Guido für __new__ beabsichtigt . Ich verstehe nicht, warum __init__ nicht aufgerufen wird.

Nehmen Sie beispielsweise das folgende Snippet, es gibt eine Instanz der Klasse User zurück, ohne __init__ aufzurufen.

%Vor%

Das ist genau das Verhalten, das ich möchte. Aber meine Frage ist, dass ich nicht verstehe, warum?

Nach den Python-Dokumenten wird __init__ aufgerufen, wenn __new__ "gibt eine Instanz von cls zurück."

Warum wird __init__ nicht einmal aufgerufen, obwohl __new__ eine Klasseninstanz zurückgibt?

    
Bobby Chambers 01.08.2011, 19:28
quelle

2 Antworten

10

Der -Konstruktor ( User() ) ist dafür verantwortlich, den Zuordner ( User.__new__() ) und den Initialisierer aufzurufen ( User.__init__() ) im Gegenzug. Da der Konstruktor nie aufgerufen wird, wird der Initialisierer nie aufgerufen.

    
Ignacio Vazquez-Abrams 01.08.2011, 19:36
quelle
10

Weil Sie den üblichen Konstruktionsmechanismus umgehen, indem Sie __new__ direkt aufrufen. Die __init__ -after- __new__ -Logik ist in type.__call__ (in CPython siehe typeobject.c , type_call -Funktion), also nur, wenn Sie User(...) machen würden.

    
Cat Plus Plus 01.08.2011 19:37
quelle

Tags und Links