【问题标题】:I am getting error in this simple piece of code while using super function使用超级功能时,我在这段简单的代码中遇到错误
【发布时间】:2021-04-21 10:10:58
【问题描述】:

我尝试稍微更改一下代码,但没有奏效。 无论如何,这是代码。

class Car:
    def __init__(self,model,name,year):
        self.name=name
        self.model=model
        self.year=year
        self.Class='normal'
        self.odometer=0
    def descriptive_name(self):
        return f'{self.year} {self.name} {self.model}'
    def type(self):
        return self.Class
    def odometer_reading(self):
        return self.odometer

class Battery:
    def __init__(self):
        self.capacity='75 kwh'
    def get_capacity(self):
        return self.capacity

class Electric_car:
    def __init__(self,model,name,year):
        super(Car()).__init__(model,name,year)
        self.battery=Battery()
        self.Class='Electric_car'
    def my_battrey(self):
        return self.battery.get_capacity()

上面的代码和下面的代码在同一个目录下。 将上面的代码命名为 main.py 并在同一目录中将下面的代码写入新文件并尝试运行它。

import main
my_scorpio=main.Car('s','scorpio',2019)
print(my_scorpio.descriptive_name())
print(my_scorpio.odometer_reading())
print(my_scorpio.type())
my_tesla=main.Electric_car('s','Tesla',2019)
print(my_tesla.descriptive_name())
print(my_tesla.odometer_reading)
print(my_tesla.type())
print(my_tesla.my_battrey())

【问题讨论】:

  • 那么问题到底是什么?
  • 继承使用:class ClassName(InheritedClass):,然后使用super()也可以使用:InheritedClass.__init__(self, attributes)
  • 如果你使用super,你应该有一个超类。
  • class Electric_car(Car):(我将其重命名为class ElectricCar(Car):)+super().__init__(model, name, year)?

标签: python python-3.x class oop


【解决方案1】:
class Electric_car:
    def __init__(self,model,name,year):
        super(Car()).__init__(model,name,year)

我从你的标题猜到这是当前的问题。

在 python 中,你必须明确地说 ElectricCar 使用这种语法从 Car 继承

class Electric_car(Car):
    def __init__(self,model,name,year):
        # this will give you the bound super object
        # from the inheritance Car > ElectricCar
        super(Car, self).__init__(model,name,year)

然后使用super(Car, self) 将知道在继承树中查找的位置。

正如 cmets 中所指出的,您也可以选择 super(ElectricCar, self),因为 isinstance(self, ElectricCar) 确实如此。

这里的错误是没有通过指定来设置继承树 ElectricCar 是 Car 的子类,因此您无法得到它 远!

如果没有继承位,那么isinstance(self, Car) 将是错误的,因为 self 是 ElectricCar 类型,它不继承自 Car

我真的建议阅读super 的文档,因为它解释了当你使用它时会发生什么!

【讨论】:

  • 不会是super(Electric_car, self).__init__(...)吗?在python3中你可以省略类型并使用super().__init__(...)
  • 是的,你是对的。用两个参数调用的 super 也可以这样工作。每当isinstace(obj, type) 时,super(type, obj) 都会返回绑定的超级对象,因此任何 ElectricCar 都是 ElectricCar 的实例,它可以工作。由于我们想使用父方法,我们也可以将 Car 放在那里,因为它满足 isinstance(self, Car) 因为继承。
  • 如果你把Car放进去,它是有效的,但不会运行Car.__init__方法。它将从Car 沿继承顺序运行下一个类,在本例中为object,并且是无操作的。
【解决方案2】:

调用 super 的正确方式(旧式)是:

super(Electric_car, self).__init__(model,name,year)

或者简单地说(在 Python 3.x 中):

super().__init__(model,name,year)

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2023-04-11
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多