2016-08-21 3 views
1

В следующих кодах я продолжал получать ту же ошибку, хотя я перепроверил ее более 15 минут. Для вашей информации, я побежал на возвышенном тексте и ошибках:TypeError: super() принимает не менее 1 аргумент [Python 3]

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

Код, как показано ниже:

class Car(): 
"""A simple attempt to represent a car.""" 

def __init__(self, make, model, year): 
    self.make = make 
    self.model = model 
    self.year = year 
    self.odometer_reading = 0 

def get_descriptive_name(self): 
    long_name = str(self.year) + ' ' + self.make + ' ' + self.model 
    return long_name.title() 

def read_odometer(self): 
    print("This car has " + str(self.odometer_reading) + " miles on it.") 

def update_odometer(self, mileage): 
    if mileage >= self.odometer_reading: 
     self.odometer_reading = mileage 
    else: 
     print("You can't roll back an odometer!") 

def increment_odometer(self, miles): 
    self.odometer_reading += miles 

class ElectricCar(Car): 
    """Represent aspects of a car, specific to electric vehicles.""" 

    def __init__(self, make, model, year): 
     """Initialize attributes of the parent class.""" 
     super().__init__(make, model, year) 

my_tesla = ElectricCar('tesla', 'model s', 2016) 
print(my_tesla.get_descriptive_name()) 
+1

исправьте свой отступ класса Car –

+2

Можете ли вы проверить, что вы действительно используете python 3, а не python 2. На многих системах под управлением «python» получается python2. 'super' отличается в python 2.7 и 3.x –

+1

Это сообщение об ошибке' super() 'возникает, когда вы используете python2 вместо python3. –

ответ

2

Проблемы здесь является довольно well documented один на StackOverflow. Но я объясню, как вы используете super() неправильно. Вы используете то, что называется Old Style classes, пытаясь использовать super(). Новые классы стиля унаследовать от object и могут использоваться в Python 2.2 и выше (Python 3 исключительно использует классы стиля).

Вашего объявление класса Car должно выглядеть следующим образом ->class Car(object): (Carнаследуется отobjectвстроенных), с вашим super вызова, имеющим класс объект находится, и self передается в качестве аргументов:

super(ElectricCar, self).__init__(make, model, year) 

Теперь, если мы печати из типа объекта my_tesla является:

>>> print type(my_tesla) 
<class '__main__.ElectricCar'>  

Мы можем видеть его тип ElectricCar.

Теперь почему все это важно? Ну, есть несколько ключевых различий между стилями. В старом стиле, класс и объекты, которые он определяет для экземпляра, имеют разные типы. В классах старого стиля экземпляры всегда имеют тип instance, независимо от их класса. С новыми классами стилей экземпляр, как правило, будет иметь тот же тип, что и у класса. Примеры:

Старый Стиль ->

>>> class MyClass: 
    pass 
>>> print type(MyClass) 
>>> print type(MyClass()) 
<type 'classobj'> 
<type 'instance'> 

Новый стиль ->

>>> class MyClass(object): 
    pass 
>>> print type(MyClass) 
>>> print type(MyClass()) 
<type 'type'> 
<class '__main__.MyClass'> 

Пожалуйста, обратитесь к официальной документации Python на super().

Смежные вопросы