python - 如何在 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__
)。解决这个问题的正确方法是什么?
解决方案
以下内容对您有帮助吗?
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_range
为calc_range_Car
and calc_range_Hybrid
。我知道这可能并不理想,因为在子类中覆盖超类方法非常有用。
输出
10
10
推荐阅读
- discord.js - 我在 discord.js 中遇到权限覆盖问题
- android - 如何在单元测试中使用 android 依赖项?
- css - 我的 div 元素位置有问题
- c++ - 无法实例化抽象类
- firebase - 阻止阅读某个收藏
- angular - Angular 7 参数路由覆盖非参数路由
- python - 无法在 Python 中使用“键盘”库模拟 ctrl+shift+left
- c++ - 使用 ogg vorbis 播放声音会导致链接器错误 ov_open is undefined。以下代码有什么问题?
- sql - 将记录中的两个最小值相加
- javascript - laravel api token - 数据不显示