如何在派生类的子类中使用基类的方法?

2024-09-30 14:31:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要python在下面的程序中使用基类的方法。 我阅读了大量的文档,即使在那之后,我也无法理解当下面这种情况发生时super是如何工作的

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类的方法,我想我可以在这里使用合成概念。但我需要知道超级是怎么运作的。我还知道mro可以获取python查找方法的顺序。先生

car = Hybrid("blue", "Audi", "hyrid", 50)
car.speed()

任何更好的编写上述代码的方法都是最受欢迎的。 我想如果我用super()得到了上述问题的解决方案,我就能正确地理解super的完整功能。 为了了解所有的可能性,我使用了不同的语法。别介意

提前谢谢


Tags: 方法selfreturntimeinitdefcarcompany
2条回答

这应该起作用:

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 in Car class speed方法,则不需要使用第二个参数velocity,因为在方法中不使用此参数,而是使用self.velocity,它是在init中创建的

您可以使用lambda函数将旧的speed方法“映射”到变量

尝试在混合类中创建lambda函数

self.speed_carclass = lambda speed x=Car: Car.speed(x)

然后在外面上课叫它

hybrid_speed = <class istance>.speed_carclass()

当您创建汽车时,混合动力车的速度将与速度变量的值相同

相关问题 更多 >