Az objektumorientált programozási nyelvek egy részében (pl. Java, C++, C# ) a konstruktor az a speciális metódus, amely létrehozza ÉS inicializálja a példányobjektumot, amikor az létrejön. A Python azonban e tekintetben ezektől némiképp eltér, mert van egy külön metódusa, a __new__, amely felel a példány létrehozásáért, és van az __init__, amelyen belül, a már létrejött példány adatattribútumai kezdeti értékének beállítása, röviden inicializálása történik.
Ennek ellenére nem ritkán az __init__ metódust konstruktorként emlegetik. Ez mindaddig nem jelent gondot, amíg az elnevezés pontatlansága ellenére tudjuk miről beszélünk.
Annak oka, hogy miért nevezik sokan az __init__ metódust konstruktornak az lehet, hogy a példány létrehozásáért ténylegesen felelős __new__ metódust explicite nem kell megjeleníteni a forráskódban, mert példányosításkor az automatikusan meghívódik, és ez hívja meg utána az __init__ metódust, amit viszont a legtöbb esetben definiálunk, hiszen általában a példányok rendelkeznek adatattribútumokkal, amelyeket itt határozunk meg.
Röviden, úgy is összefoglalhatjuk az elnevezés és a funkció keveredésének okát, hogy míg a példányosítás kétlépcsős folyamatában (létrehozás és inicializálás) az __init__ szem előtt van, addig a __new__ rejtve marad, és így a láthatóval azonosítjuk azt is, ami nem látható.
Bár az esetek nagy részében a __new__ metódust nem írjuk felül, de vannak speciális feladatok és helyzetek, amikor ezt a megoldás érdekében meg kell tenni, mert az __init__ használata nem vezet eredményre. Ilyen például, amikor egy nem változtatható típusból (pl. str) való öröklést kívánunk megvalósítani. Erre mutat példát az alábbi osztálydefiníció.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class UpperCaseStr(str): """A str osztály specializált alosztálya, amely a példányosításkor megadott str típusú argumentum nagybetűs változatát adja vissza. """ def __new__(cls, string): inst = super().__new__(cls, string.upper()) return inst # TESZT uppercase_txt = UpperCaseStr('python') print(uppercase_txt ) # Eredmény: PYTHON |
Minderről részletesen a Python tudásépítés lépésről lépésre e-könyv „A példányosítási folyamat befolyásolása” fejezetében olvashatunk.