TypeError: super()至少接受一个参数[python3]

本问题已经有最佳答案,请猛点这里访问。

在下面的代码中,我不断地得到相同的错误,尽管我重新检查了它超过15分钟。你的信息,我运行它崇高的文本和错误:

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

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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())


这里的问题在StackOverflow上有很好的文档说明。但是我将解释您如何不正确地使用super()。在尝试使用super()时,您使用的是所谓的旧式类。新样式类继承自object,可以在Python 2.2和更高版本中使用(Python 3只使用新样式类)。

你的Car类声明应该是这样的-> class Car(object): (Car继承自内置的object),你的super调用有对象所在的类,并且self作为参数传入:

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

现在,如果我们打印出对象的类型my_tesla是:

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

我们可以看到它的类型是ElectricCar

为什么这些都很重要呢?这两种风格之间有一些关键的区别。在旧的样式中,类及其为实例化定义的对象具有不同的类型。在旧式类中,实例的类型总是instance,而不管它们的类是什么。对于新样式类,实例通常将共享其类所具有的相同类型。例子:

老式- >

1
2
3
4
5
6
>>> class MyClass:
    pass
>>> print type(MyClass)
>>> print type(MyClass())
<type 'classobj'>
<type 'instance'>

新风格- >

1
2
3
4
5
6
>>> class MyClass(object):
    pass
>>> print type(MyClass)
>>> print type(MyClass())
<type 'type'>
<class '__main__.MyClass'>

请参考Python关于super()的官方文档。