2013-06-27 16 views
7

oluşturmak için geri dönüş hatası İlk kapalı, Python'daki bir sınıfın __init__() işlevinin bir değer döndüremeyeceğini biliyorum, bu nedenle bu seçenek kullanılamıyor.Python __init__

Kodumun yapısı nedeniyle, sınıfın __init__ işlevinin içinde veri bildirimleri (ve kullanıcının bilgi vermesini istediği) olması mantıklıdır. Bununla birlikte, bu, nesnenin yaratılmasının başarısız olabileceği anlamına gelir ve ben bundan hoş bir şekilde kurtulabilmek isterim.

Bununla devam etmenin en iyi yolunun ne olduğunu merak ediyordum. Küresel bir booleanı 'geçerli inşaat' bayrağı olarak seçmeyi düşündüm, ama yapmamayı tercih ediyorum.

Diğer tüm fikirler (yeniden yapılanmaların yanı sıra, yeniden başlatmaların dışında başlatmalar gerçekleşebilir ve değerler argüman olarak iletilir)? Temel olarak, başarıya dönüşün 0 olması için bir yol arıyorum ve başlatma sırasında hata durumunda -1 değerini döndürüyorum. (Çoğu C sistem çağrısı gibi)

+8

Bir istisnayı kaldırın. –

+1

Başarı durumunda 0 döndürme ve başarısızlık durumunda -1 çok Pythonic değildir. Hata geri dönüşleri kötüdür, çünkü göz ardı edilmeleri kolaydır ve işlemek için ayrıntılıdır. Bunun da ötesinde, 0 ve -1 değerini boolean değerleri olarak kullanmak, hiçbir yararı olmayan karışıklığı ekler. C kodu yazmak için Python kullanmak doğru değildir. – abarnert

+0

As @jsbueno cevabında dikkat çekiyor, sınıf örnekleri _initialized_ '__init __()' de oluşturulamıyor, bu yüzden bir değer döndürmüyor. Başarısızlıkları algılamak veya bir istisna atmak için global bir değişken kullanmak yerine, durumunuzu belirtmek için sınıfınıza bir veri elemanı ekleyebilir ve daha sonra değerini doğrudan kontrol edebilir veya __init __() 'değerinden sonra değerini döndüren bir yöntem çağırabilirsiniz. yanlış olduğunda bir şey (ve muhtemelen ne) belirlemek için çağrıldı. – martineau

cevap

11

assertio ya başarısız bir özel durumu yükseltebilir veya -, gerçekten istemiyorum ya istisnalar dışında çalışamaz eğer, kendi sınıflarında __new__ yöntemi yazabilir - Python , __init__ teknik olarak ise "initializer" yöntemi - ve o, özniteliklerini doldurmalı ve nesnenin yaşam döngüsü boyunca ihtiyaç duyacağı bazı kaynakları ve diğerlerini almalıdır - Ancak, Python, __init__'dan önce çağrılan gerçek bir kurucu, __new__ yöntemini tanımlar - ve Bunun aksine, __new__ aslında bir değer döndürür: yeni oluşturulan (başlatılmamış) örneğin kendisi.

Yani __new__ içine Çeklerinizin yerleştirebilir ve ve sadece Hiçbiri dönmek şey başarısız olduğu - Aksi, üst sınıf __new__ yöntemine çağrının sonucu döndüren (bir saf Python nesne için gerçek bellek tahsisini yapamaz böylece sonuçta bir üst sınıfta yerel kodda yazılmış bir kurucusunu çağırmak zorunda - genellikle bu sınıf hiyerarşisinin tabanında object.__new__ olduğunu

NB. Python 2'de, sizin için temel sınıf olarak object olmalıdır hiyerarşiniz - aksi takdirde sadece __new__ çağrılmaz, daha sonra Python nesnelerine eklenen bir çok özellik çalışmayacaktır. class MyClass(object):, asla class MyClass: - Python3 üzerinde değilseniz.

+0

'__new__',' __init__' önce çağrılır. Bunu denedim, ancak bir sınıfın bir örneğini (Py2.7) oluşturduğumda '__new__' denir. –

+0

Onu buldum. Nesnenizi sınıfınızda genişletmeniz gerekiyor. Bu olmadan, yeni çağrılmayacak! –

+0

Hayır. Nesne taban sınıfını çıkarırsam, '__new__' otomatik olarak çağrılmaz. Git rakam! –

0

Bir istisnayı yükseltmeyi düşündünüz mü? Bu, bir hatayı bildirmenin alışılmış yoludur.