Python 如何在派生类的子类中使用基类的方法?
我需要python在下面的程序中使用基类方法。 我读了很多文档,即使在那之后,我也无法理解当下面这种情况发生时super是如何工作的Python 如何在派生类的子类中使用基类的方法?,python,oop,super,Python,Oop,Super,我需要python在下面的程序中使用基类方法。 我读了很多文档,即使在那之后,我也无法理解当下面这种情况发生时super是如何工作的 class Car: time = 2 def __init__(self, color, company,powertrain,velocity): self.color = color self.company = company self.powertrain = powertrain
class Car:
time = 2
def __init__(self, color, company,powertrain,velocity):
self.color = color
self.company = company
self.powertrain = powertrain
self.velocity = velocity
def speed(self):
return self.velocity
def __self__(self):
return self.powertrain #just self.powertrain to print it
class Conventional(Car):
def speed(self):
return self.velocity *self.time*2
class Electric(Car):
def __init__(self):
super().__init__()
def speed(self):
return super().velocity * super().time*3
class Hybrid(Electric,Conventional):
pass
现在我需要混合对象来使用Car类的方法,我想我可以在这里使用合成概念。但我需要知道super在这里是如何工作的。我还知道mro可以获取python查找方法的顺序。先生
car = Hybrid("blue", "Audi", "hyrid", 50)
car.speed()
任何编写上述代码的更好方法都是最受欢迎的。
我认为如果我使用super()获得上述问题的解决方案,我就可以正确地理解super的完整功能。
为了查看所有的可能性,我使用了不同的语法。别介意
提前感谢这应该可以:
super(Electric, Electric).speed(self, velocity)
说明:
super可以接受两个可选参数,一个是它应该使用的超类(直接超类),另一个是它应该在MRO中开始搜索的类:
MRO:混合动力->电动->汽车->传统->汽车
通过电气,我们制造MRO:
汽车->传统->汽车
(多重继承很糟糕)
当我们像这样解析继承时,我们还需要显式地传递当前对象(self)。
顺便说一句,你应该修正你的初始化,它们不能正确解析,你应该总是传递*参数,让超级解析为你解析参数
class Car:
time = 2
def __init__(self, color, company,powertrain,velocity):
self.color = color
self.company = company
self.powertrain = powertrain
self.velocity = velocity
def speed(self, velocity):
return self.velocity
def __self__(self):
return self.powertrain #just self.powertrain to print it
class Conventional(Car):
def __init__(self,*args):
super().__init__(*args)
def speed(self):
return self.velocity *self.time*2
class Electric(Car):
def __init__(self,*args):
super().__init__(*args)
def speed(self):
return super().velocity * super().time*3
class Hybrid(Electric,Conventional):
def __init__(self,*args):
super().__init__(*args)
def speed(self):
return super(Electric, Electric
).speed(self,50)
car = Hybrid("blue", "Audi", "hyrid", 50)
car.speed()
首先,尝试重新组织代码。如果在汽车类速度方法中使用self.velocity,则不需要使用第二个参数velocity,因为在方法中不使用该参数,而是使用在init中创建的self.velocity 您可以使用lambda函数将旧的速度方法“映射”到变量 尝试在混合类中创建lambda函数
self.speed_carclass = lambda speed x=Car: Car.speed(x)
然后在课外叫它
hybrid_speed = <class istance>.speed_carclass()
hybrid\u speed=.speed\u carclass()
混合动力车的速度将与您创建汽车时的速度变量值相同我希望它能澄清您的所有疑问