Sormak üzere olduğum soru Python'un __new__ ve __init__ kullanımının bir kopyası gibi görünüyor ? ama ne olursa olsun, __new__ve arasındaki pratik farkın tam olarak ne olduğu benim için hala belirsiz __init__.
Bunun __new__nesneler yaratmak için olduğunu ve __init__nesneleri başlatmak için olduğunu söylemeden önce , açık konuşayım: Anlıyorum. Aslında, bu ayrım benim için oldukça doğal, çünkü yeni yerleşimin olduğu C ++ deneyimim var , bu da benzer şekilde nesne tahsisini başlatmadan ayırıyor.
Python C API öğretici şöyle açıklıyor:
Yeni üye, türdeki nesneleri oluşturmaktan (başlatmanın aksine) sorumludur.
__new__()Yöntem olarak Python'da ortaya çıkar . ... Yeni bir yöntemi uygulamanın bir nedeni, örnek değişkenlerinin başlangıç değerlerini sağlamaktır .
Yani, evet - ben almak Ne __new__yapar, ama buna rağmen, ben hala onu Python yararlı neden anlamıyorum. Verilen örnek __new__, "örnek değişkenlerinin başlangıç değerlerini garanti altına almak" istiyorsanız bunun yararlı olabileceğini söylüyor . Peki, bu tam olarak ne __init__yapacak değil mi?
C API eğitiminde, yeni bir Type ("Noddy" olarak adlandırılır) oluşturulduğu ve Type'ın __new__işlevinin tanımlandığı bir örnek gösterilmektedir . Noddy türü, adı verilen bir dize üyesi içerir firstve bu dize üyesi, aşağıdaki gibi boş bir dizeyle başlatılır:
static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
.....
self->first = PyString_FromString("");
if (self->first == NULL)
{
Py_DECREF(self);
return NULL;
}
.....
}
__new__Burada tanımlanan yöntem olmadan, PyType_GenericNewtüm örnek değişken üyelerini NULL olarak başlatan kullanmamız gerektiğine dikkat edin. Dolayısıyla, __new__yöntemin tek yararı , örnek değişkeninin NULL yerine boş bir dize olarak başlayacak olmasıdır. Ama bu neden her zaman yararlıdır, çünkü örnek değişkenlerimizin bir varsayılan değerle başlatıldığından emin olsaydık, bunu __init__yöntemde yapabilirdik?
__new__değildir, çünkü ortak metin asla değişmez. Bazen bu belirli kodu farklı bir şeyle değiştirmeniz gerekir.