SORU
1 ŞUBAT 2011, Salı


Python (Python ve C API): ____ __init karşı yeni__

Soruyu ben sormak gibi bir yinelenen Python's use of __new__ and __init__ ? ama ne olursa olsun, hala belirsiz bana tam olarak ne pratik arasındaki fark __new__ __init__.

__new__ nesneleri oluşturma ve __init__ başlatma nesneleri için olduğunu bana söylemek için acele önce, şunu açıkça söyleyeyim:Anlıyorum.Aslında, bu ayrım benzer şekilde başlatma nesneden ayırma ayıran placement new, sahip olduğumuz C tecrübeliyim beri benim için oldukça doğaldır.

Python C API tutorial şöyle açıklıyor:

Yeni üye sorumludur oluşturma başlatılıyor (karşıt olarak) bu tür nesneler. Maruz olduğunu Bu Pythonyeni() yöntem. ... Yeni bir yöntemi uygulamak için bir sebep ilk değerlerini güvence altına alınmasıdır örnek değişkenler.

Yani, evet - benolsun6 ** ama buna rağmen, öyle görünüyorhalaişe yarıyor anlamıyorum neden Python. Verilen örnek __new__ Eğer isterseniz yararlı olabileceğini söylüyor "örnek değişkenleri ilk değerlerini". temin ederim Tam olarak __init__ ne yapacağını iyi, değil mi?

C API öğretici bir örnek yeni bir Tür nerede gösterilir ("") Ahmak oluşturulur ve Türü __new__ fonksiyonu tanımlanır. Noddy türü dize üyesi first, ve bu dize üye adı: boş bir dize başlatıldı içerir

static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
    .....

    self->first = PyString_FromString("");
    if (self->first == NULL)
    {
       Py_DECREF(self);
       return NULL;
    }

    .....
}

__new__ yöntem burada tanımlı olmayan, sadece örneği tüm BOŞ değişken üyeleri başlatır PyType_GenericNew, kullanmak zorunda kalırız unutmayın. __new__ yöntemin tek yararı örnek değişkeni NULL olarak karşı boş bir dize olarak başlayacak.Ama neden bu hiç bir örnek ve bizim bazı değişkenleri varsayılan değer olarak başlatılır emin değer verdiğimiz, sadece __init__ yöntemi yapabilirdik beri yararlı mı?

CEVAP
1 ŞUBAT 2011, Salı


Fark esas olarak kesilebilir vs değişmez türleri ile ortaya çıkar.

__new__ kabul ederyazınilk argüman olarak, ve genellikle bu tür yeni bir örneğini verir. Böylece her ikisi de değişken ve değişmez türleri ile kullanmak için uygundur.

__init__ kabul ederörnekilk bağımsız değişken olarak ve bu örneği özniteliklerini değiştirir. Bu onları obj.__init__(*args) çağırarak oluşturulduktan sonra değiştirilmesi için izin vermesi gibi değişmez bir türü için uygun.

tuple list davranışlarını karşılaştırmak:

>>> x = (1, 2)
>>> x
(1, 2)
>>> x.__init__([3, 4])
>>> x # tuple.__init__ does nothing
(1, 2)
>>> y = [1, 2]
>>> y
[1, 2]
>>> y.__init__([3, 4])
>>> y # list.__init__ reinitialises the object
[3, 4]

Olarak neden onlar ayrı bir yana, basit bir tarihsel nedenler): __new__ yöntemleri gerektiren bir demet demirbaş almak doğru (ilk nesne oluşturma ve daha sonra hatırlamak için geri nesne sonunda). __init__ yöntemler, aksine, ayarlamak için gereken her şeyi ayarlamak beri ölü basittir.

Kenara __init__ yöntem olmaktan daha kolay yazmak ve değişken vs değişmez ayrım kaydetti şeyden önce, ayrılık da olmak için kullanılabilir olun çağıran üst sınıf __init__ alt sınıflar isteğe göre ayarlama herhangi kesinlikle gerekli örnek değişmezler __new__. Bu genellikle - genellikle gerektiği gibi sadece üst sınıf __init__ yöntemler aramak daha net olsa şüpheli bir uygulamadır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • Jesse Pimenta

    Jesse Piment

    5 EKİM 2011
  • Lena Danya

    Lena Danya

    11 NİSAN 2010