Java ve C ++ , bellek düzeni nedeniyle bir temel sınıf yapıcısının çağrılmasını gerektirir .
Eğer bir sınıf varsa BaseClass
bir üyesi ile field1
, ve yeni bir sınıf oluşturmak SubClass
üye ekler field2
, sonra bir örneğini SubClass
için boşluk içeriyorsa field1
ve field2
. Sen bir yapıcısı ihtiyaç BaseClass
doldurmak için field1
tekrarlamayı tüm miras sınıfları gerektirmediği sürece, BaseClass
kendi kurucularınızdaki 'ın başlatma. Ve eğer field1
özeldir, o zaman miras sınıflar yapamam initialise field1
.
Python Java veya C ++ değildir. Tüm kullanıcı tanımlı sınıfların tüm örnekleri aynı 'şekle' sahiptir. Temel olarak sadece özelliklerin eklenebileceği sözlüklerdir. Herhangi bir başlatma yapılmadan önce, kullanıcı tanımlı tüm sınıfların tüm örnekleri neredeyse tamamen aynıdır ; bunlar henüz saklamayan özellikleri depolayabilecek yerlerdir.
Bu nedenle, bir Python alt sınıfının temel sınıf yapıcısını çağırmaması mükemmeldir. İsterse özniteliklerin kendisini ekleyebilir. Hiyerarşideki her sınıf için belirli sayıda alan için ayrılmış alan yoktur ve bir BaseClass
yöntemden kod tarafından eklenen bir özellik ile bir yöntemden kod tarafından eklenen bir özellik arasında fark yoktur SubClass
.
Yaygın olduğu gibi, SubClass
aslında BaseClass
kendi özelleştirmesini yapmadan önce tüm değişmezlerinin ayarlanmasını isterse, evet, sadece arayabilir BaseClass.__init__()
(veya kullanabilirsiniz super
, ancak bu karmaşık ve bazen kendi sorunları vardır). Ama zorunda değilsin. Ve bunu önce, sonra veya farklı argümanlarla yapabilirsiniz. Cehennem, eğer istersen BaseClass.__init__
tamamen başka bir yöntemden çağırabilirsin __init__
; belki bazı tuhaf tembel başlatma şeyleri gidiyor.
Python bu esnekliği işleri basit tutarak elde eder. __init__
Nitelikleri ayarlayan bir yöntem yazarak nesneleri başlatırsınız self
. Bu kadar. Tam olarak bir yöntem gibi davranır, çünkü tam olarak bir yöntemdir. İlk olarak yapılması gerekenler veya başka şeyler yapmazsanız otomatik olarak gerçekleşecek şeyler hakkında başka garip ve sezgisel kurallar yoktur. Hizmet etmesi gereken tek amaç, başlangıç niteliği değerlerini ayarlamak için nesne başlatma sırasında yürütülecek bir kanca olmaktır ve bunu yapar. Başka bir şey yapmasını istiyorsanız, bunu açıkça kodunuza yazarsınız.
__init__
Yöntemi devralmak için bir dekoratör yazabilir ve hatta otomatik olarak alt sınıfları arayabilir ve dekore edebilirsiniz.