2009-10-19 21 views
5

Python 2.6 ile temel bir Monostate'im var. mutlu bana aşağıdaki eskimesi uyarı verirMonostate ile Python Deprecation Uyarıları __new__ - Birisi nedenini açıklayabilir mi?

class Borg(object): 
    __shared_state = {} 
    def __new__(cls, *args, **kwargs): 
     self = object.__new__(cls, *args, **kwargs) 
     self.__dict__ = cls.__shared_state 
     return self 

    def __init__(self, *args, **kwargs): 
     noSend = kwargs.get("noSend", False) 
     reportLevel = kwargs.get("reportLevel", 30) 
     reportMethods = kwargs.get("reportMethods", "BaseReport") 
     contacts= kwargs.get("contacts", None) 

a = Borg(contacts="Foo", noSend="Bar",) 

..

untitled:4: DeprecationWarning: object.__new__() takes no parameters 
    self = object.__new__(cls, *args, **kwargs) 

Bunu bulmak googling biraz Bug #1683368 eklendikten sonra. Anlayamadığım şey bunun ne anlama geldiğini. Bu, aşağıdaki çizgi hakkında şikâyette bulunuyor. Bu, aşağıdaki gibi görünüyor: Tamam. Birisi bunun neden bir sorun olduğunu Laymens terimiyle açıklayabilir. Anladığım kadarıyla, "bu liste gibi diğer yapılarla tutarsızdır" ama nedenini anladığımdan emin değilim. Birisi bunu bana bunu yapmanın doğru yolu gösterdiğini açıklar mı?

sayesinde bu uyarıyı neden olur

cevap

1

uyarı her yerde göz ardı ediyoruz beri __new__() args (cls'ye hariç) geçen args VAR, ancak olmasından kaynaklanır. Aslında (şu anda) ekstra hataların geçmesi için bir hata değil, ancak hiçbir etkisi yoktur.

Py3K'de, bu hataların iletilmesi bir hata olur.

+0

--Guido? * Args ve ** kwargs'ları çıkar ve bombalar, onları beklerken __init__ tarafından ihtiyaç duyulduğu için bombalar. Son ifadeyi engellemeye çalıştığım bir tanesi var :-) 3k'da çalışmasını istiyorum. – rh0dium

+0

Dil tasarımcıları ile tartışamam. "Yeni herhangi bir argüman almaz" derlerse, bunun hiçbir argüman almamasını sağlarım. __init__' ve '__new__' benzer şekilde çalışır, belki de kullanım durumunuz yeni yerine init kullanmalıdır. –

6

python-singleton-object-instantiation bakın ve Alex Martelli's tekil örnek not:

__new__ deprecation soru answered by Guido oldu
class Singleton(object): 

    __instance = None 

    def __new__(cls): 
     if cls.__instance == None: 
      __instance = type.__new__(cls) 
      __instance.name = "The one" 
     return __instance 

:

mesajı diyor sadece ne demektir. :-) object .__ new __() öğesinin bir class parametresinden daha fazlası ile çağrılmasının hiçbir anlamı yoktur ve 'un yaptığı herhangi bir kod, bu argonları yalnızca bir kara deliğe döküyordu.

ekstra argümanları göz ardı etmek, yeni __ .__ nesne için mantıklı sadece zaman() o kılınmasını değilken, ancak kılınmasını __init__ olduğunu - o zaman tamamen varsayılan __New__ denetimi var kurucu argümanları __init__ için yeniden seçilmiştir.

Tüm bunların amacı nesnesi (42) gibi kullanılmayan bir argümanı geçen bir çağrıdaki hatayı yakalamaktır. Bu, programınızdaki bir hatanın belirtisi olan .

Onların göz ardı görmek başaramıyorum

+0

Bu bir singleton (aka highlander) bir borg (monostat) değil. Bu konuda zaten [1] [1] oldum.Ben de hazır Guido'nun yorumları var ama eğer init * args ** kwargs ve sonra __new__ onları da gerektirir? Sağ?? [1]: http://stackoverflow.com/questions/1575680/ensure-that-only-one-instance-of-a-class-gets-run – rh0dium

+0

Üzgünüm, cesur ve link dağıldı .. – rh0dium

+0

Guido Açıkça, yapıcı argümanlarını kontrol etmek için sadece __init__ gerektiğini söylüyor. – gimel

İlgili konular