__new__ vs. __init__

Python disponuje třemi magickými metodami: __new__, __init__ a __del__. Nejznámější __init__ je typickým konstruktorem, který je stejný jako ve všech ostatních jazycích, __del__ je destruktor, který se také neliší od ostatních. K čemu ale teda slouží __new__?

Proces vytvoření objektu se skládá z dvou kroků: vytvoření a inicializace. K vytvoření objektu slouží právě metoda __new__. Argumenty metody __new__ jsou reference dané třídy a argumenty pro inicializaci objektu, se kterými se dále volá __init__. Metoda __new__ tedy slouží k upravení objektu při jeho vytváření (v knihovně NumPy se toto využívá mimo jiné i při upravování immutable struktur).

Pozor na změnu od Pythonu 3.3: při navracení v __new__ se volá pouze object.__new__(cls) namísto object.__new__(cls, *args, **kwargs)!

Očekávaný výstup:

Další “výhoda” přetížení metody __new__ spočívá ještě v něčem; umožňuje nám vracet objekty jiné třídy. Pokud ale budeme vracet objekt jiné třídy, krok __init__ úplně přeskočíme.

Dostaneme:

No a k čemu to vlastně je?

Jak už jsem psal, přetížení dané metody se využívá při upravování immutable datových typů, ale creator __new__ je užitečný třeba v singletonech, kde chceme, aby byla třída instanciována pouze jednou. Docílíme toho např. takto: