Neden kuruculara gerçekten "Oluşturucular" deniyor?
Yapıcı (adlandırılmış __new__), sınıfın yeni bir örneğini oluşturur ve döndürür. Dolayısıyla, C.__new__sınıf yöntemi, C sınıfının yapıcısıdır .
C.__init__Oluşturulduktan sonra örnek yöntemi arayana geri geçirilen önce başlatılması, belirli bir örneğinde denir. Bu yöntem, yeni C örnekleri için başlatıcıdır .
Bir sınıftaki yöntemlerden nasıl farklıdırlar?
Belirtildiği gibi resmi belgeler __init__ olduğu örneği oluşturulduktan sonra denir . Diğer yöntemler bu tedaviyi almaz.
Amaçları ne?
Yapıcının amacı, C.__new__yeni bir Cörneğin oluşturulması sırasında özel davranışı tanımlamaktır .
Başlatıcı'nın amacı , oluşturulduktan sonra C.__init__her bir vakanın özel başlatılmasını tanımlamaktır C.
Örneğin Python şunları yapmanıza izin verir:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Ama her şeyi istiyorsan örneğiniTestx 10'a eşit bir özniteliğe sahip olmasını istiyorsanız, bu kodu içine koyabilirsiniz __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
Her örnek yöntem (bir sınıfın belirli bir örneğinde çağrılan bir yöntem), örneği ilk argümanı olarak alır. Bu argüman geleneksel olarak adlandırılmıştır self.
Yapıcı gibi sınıf yöntemleri, __new__bunun yerine sınıfı ilk bağımsız değişkeni olarak alır.
Şimdi, için özel değerler istiyorsanız x öznitelik tek yapmanız gereken bu değeri bağımsız değişken olarak iletmektir.__init__ :
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
Umarım bu, bazı şüphelerinizi gidermenize yardımcı olur ve diğer sorulara zaten iyi yanıtlar aldığınız için burada duracağım :)
__init__bir başlatıcıdır . Piton yapıcısı olduğunu__new__. Python, otomatik iki aşamalı başlatmayı kullanır -__new__geçerli ancak (genellikle) doldurulmamış bir nesne döndürür (boolbir karşı örnek için bakın ), bu daha sonra__init__otomatik olarak çağırır. Bu, C ++ gibi dillerin kısmen oluşturulmuş nesnelerde yaşadığı sorunları ortadan kaldırır - Python'da hiçbir zaman sahip olmazsınız (kısmen başlatılmış olsa da). Neredeyse her ikisi geçersiz kılmak gerekir asla__new__ve__init__bir sınıf üzerinde.