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 first
ve 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_GenericNew
tü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.