首页 > 解决方案 > 如何在 Python 中解开子和父 __init__ 方法?

问题描述

当为父类设置的属性顺序将在子类中中断时,我试图找到使用继承的正确方法。这是一个例子:

class Car:
    def __init__(self, efficiency, tank_size) -> None:
        self.efficiency = efficiency
        self.tank_size = tank_size
        self.range = self.calc_range()

    def calc_range(self):
        return self.efficiency * self.tank_size


class HybridCar(Car):
    def __init__(self, efficiency, tank_size, battery_capacity) -> None:
        super().__init__(efficiency, tank_size)
        self.battery_range = self.calc_battery_range()
        self.battery_capacity = battery_capacity

    def calc_range(self):
        return self.efficiency * self.tank_size + self.battery_range

    def calc_battery_range(self):
        return self.battery_capacity * self.efficiency

我想HybridCar调用Car's__init__方法,但我无法让它工作。我不能打电话self.calc_range()HybridCar因为我没有self.battery_range定义。而且我无法定义self.battery_range,因为这依赖于self.efficiency我尚未定义的 。我能看到的唯一方法是让 HybridCar 不要调用Car's__init__方法,而是使用所有相同的代码。我想避免这种情况,因为__init__方法中有很多代码(真正的类做的远不止这些),而且有很多重复的代码似乎是不好的做法(而且 pylint 警告我不要调用super().__init__)。解决这个问题的正确方法是什么?

标签: pythonoopinheritance

解决方案


以下内容对您有帮助吗?

class Car:
    def __init__(self, efficiency, tank_size) -> None:
        self.efficiency = efficiency
        self.tank_size = tank_size
        self.range = self.calc_range_Car()

    def calc_range_Car(self):
        return self.efficiency * self.tank_size


class HybridCar(Car):
    def __init__(self, battery_capacity, car) -> None:
        super().__init__(car.efficiency, car.tank_size)
        self.battery_capacity = battery_capacity
        self.battery_range = self.calc_battery_range()

    def calc_range_Hybrid(self):
        return self.efficiency * self.tank_size + self.battery_range

    def calc_battery_range(self):
        return self.battery_capacity * self.efficiency

parent = Car(2, 5)
child = HybridCar(10, parent)
print(child.calc_range_Car())
print(parent.range)

唯一不同的是,我是构造函数的Car对象HybridCar以及将方法重命名calc_rangecalc_range_Carand calc_range_Hybrid。我知道这可能并不理想,因为在子类中覆盖超类方法非常有用。 输出

10
10

推荐阅读