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 BaseClassbir üyesi ile field1, ve yeni bir sınıf oluşturmak SubClassüye ekler field2, sonra bir örneğini SubClassiçin boşluk içeriyorsa field1ve field2. Sen bir yapıcısı ihtiyaç BaseClassdoldurmak için field1tekrarlamayı tüm miras sınıfları gerektirmediği sürece, BaseClasskendi 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 BaseClassyö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, SubClassaslında BaseClasskendi ö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.