2016-08-15 24 views
16

Ben python2.7.11 bu kodu kullanarak bu hatayıTypeError: super() en az 1 argüman alır (0 verilen) hata herhangi bir python sürümüne özgüdür?

TypeError: super() takes at least 1 argument (0 given)

alıyorum:

class Foo(object): 
    def __init__(self): 
     pass 

class Bar(Foo): 
    def __init__(self): 
     super().__init__() 

Bar() 

geçici çözüm olurdu çalışması için:

class Foo(object): 
    def __init__(self): 
     pass 

class Bar(Foo): 
    def __init__(self): 
     super(Bar, self).__init__() 

Bar() 

Bu sözdizimi görünüyor python 3'e özgüdür. Yani, 2.x ve 3.x arasında uyumlu kodun sağlanmasının ve bu hatanın olmasının önlenmesinin en iyi yolu nedir?

+1

Bu sözdizimi Python 3 içindir. –

+0

@DanielRoseman Görüyorum, teşekkürler. daha kullanışlı biraz sonra – BPL

+1

Python 2 sözdizimi, bu durumda Python 3'te hala geçerli bazı ekstra şeyler soran biraz kaydetmiştiniz sorumu yapmak için; Her iki sürümü de desteklemek istiyorsanız, bunu kullanın. sürümleri arasındaki diğer uyumsuzlukları bir sürü unutulmamalıdır. –

cevap

22

Evet, 0-argüman sözdizimi Python 3 özgüdür, What's New in Python 3.0 ve PEP 3135 -- New Super bakın.

Python 2'de ve çapraz sürüm uyumlu olması gereken kodda, yalnızca sınıf nesnesine ve örneğine açıkça iletmek için yapıştırın.

Evet, (future kütüphanesi gibi) Python 2'de super() işin no-argüman versiyonunu yapmak müsait "backports" ama bunlar eşleşen bir işlev nesnesini bulmak için bir full scan of the class hierarchy dahil dalaverecileri bir dizi gerektirir. Bu hem kırılgan hem de yavaştır ve "kolaylık" a değmez.

3

Python2/Python3 uyumluluğuna sahip olmak için future kitaplığını kullanabilirsiniz.

super işlevi arkadan yüklendi.

+0

Oh çocuk, ama bu uygulama. Yığın çerçeve denetimi ve MRO'nun isimlerini bulmak için alan adlarının tam bir çaprazlaması mı? Bunu gerçekten tavsiye edemem. –

+7

Sadece 'süper (SınıfAdı, kendinden)' kullanmak ve kendinize biraz tekrarlayın. –