【问题标题】:How to use the method of base class in the subclass of derived class?如何在派生类的子类中使用基类的方法?
【发布时间】:2019-11-28 18:23:56
【问题描述】:

我需要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 的完整功能。 要查看所有可能性,我使用了不同的语法。别介意

提前致谢

【问题讨论】:

标签: python oop super


【解决方案1】:

这应该可行:

super(Electric, Electric).speed(self, velocity)

说明: super 可以接受两个可选参数,它应该使用的超类(直接超类),以及它应该从 MRO 开始搜索的类。: MRO:混合动力 -> 电动 -> 汽车 -> 传统 -> 汽车 通过 Electric,我们进行 MRO: 汽车 -> 常规 -> 汽车 (多重继承很糟糕) 当我们像这样解决继承时,我们还需要显式传递当前对象(self)。 顺便说一句,您应该修复您的 inits,它们不能正确解析,您应该始终传递 *args,并让 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, 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()

【讨论】:

    【解决方案2】:

    首先尝试重新组织您的代码。如果您在 Car 类 speed 方法中使用 self.velocity,则不需要使用第二个参数 velocity,因为您没有在方法中使用它,您使用的是在 init 中创建的 self.velocity。

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

    尝试在 Hybrid 类中创建 lambda 函数

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

    然后在课外调用它

    hybrid_speed = <class istance>.speed_carclass()
    

    hybrid_speed 将与您创建 Car 时的速度变量的值相同

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多