Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在派生类的子类中使用基类的方法?_Python_Oop_Super - Fatal编程技术网

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

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

我需要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类的方法,我想我可以在这里使用合成概念。但我需要知道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()

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

我希望它能澄清您的所有疑问