【问题标题】:Python combine two classesPython结合了两个类
【发布时间】:2021-03-25 19:02:43
【问题描述】:

我需要实现方法(我认为它是方法 add)负责添加带有 AirPlane 的 Сar。 我需要获得类 AirCar,其长度和重量将等于 Car 和 AirPlane 属性之间的平均值。 所以我的代码如下

class Car:
        average_speed = 60
        average_length = 5
        cars = []
    
        def __init__(self, model, speed=average_speed, length=average_length):
            self.model = model
            self.speed = speed
            self.length = length
    
    
    class AirPlane(Car):
        average_speed = 300
        average_length = 10
        AirPlane = []
    
        def magic(self):
            super(Car, self).__init__()
    
    
    class AirCar(Car, AirPlane):
        def __add__(self, other):
            if self.cars:
                self.average_speed = sum([car.speed for car in self.cars]) / len(self.cars)
                self.average_length = sum([AirPlane.length for AirPlane in self.AirPlane]) / len(self.AirPlane)
                self.Aircar.append(self)
    
Tesla = Car("Tesla", speed=300, length=4)
Boing = AirPlane('Boing', speed=600, length=20)

输出 TypeError:无法创建一致的方法解析 汽车、飞机基地的订单 (MRO)

【问题讨论】:

  • 你的问题是什么?
  • 您能否编辑您的问题以包括 1) 您的代码的输出 2) 确切的预期输出
  • 欢迎来到 Stack Overflow,希望我们能提供帮助。不过,要添加到合唱中,还请编辑您的代码以确保其格式正确。特别是对于 Python,正确缩进非常重要,因此请确保您问题中的代码与您在编辑器中查看的代码完全相同;否则很难知道发生了什么。
  • @deadshot 需要结合 Car + Airplane 得到 AirCar - 将等于 Car 和 Airplane 的属性之间的平均值

标签: python class


【解决方案1】:

我认为这可能与您正在尝试做的事情一致,但我不确定:

>>> class Vehicle:
...     average_speed = None
...     average_length = None
...     def __init__(self, model, speed=None, length=None):
...         self.model = model
...         self.speed = speed if speed is not None else self.average_speed
...         self.length = length if length is not None else self.average_length
... 
... 
>>> class Car(Vehicle):
...     average_speed = 60
...     average_length = 5
...     def __add__(self, other):
...         if isinstance(other, Plane):
...             return CarPlane(self.model + other.model,
...                             speed=(self.speed + other.speed) / 2,
...                             length=(self.length + other.length) / 2)
...         return NotImplemented
...
...     __radd__ = __add__
... 
>>> class Plane(Vehicle):
...     average_speed = 300
...     average_length = 10
... 
>>> class CarPlane(Car, Plane):
...     average_speed = (Car.average_speed + Plane.average_speed) / 2
...     average_length = (Car.average_length + Plane.average_length) / 2
>>> car = Car('Tesla')
>>> plane = Plane('Boeing')
>>> carplane = car + plane
>>> carplane
<__main__.CarPlane object at 0x7f5744c8a850>
>>> carplane.model, carplane.speed, carplane.length
('TeslaBoeing', 180.0, 7.5)

更新:如果您想将任何类型的车辆与任何其他类型的车辆结合起来,您可以更进一步并动态生成组合类:

>>> class Vehicle:
...     average_speed = None
...     average_length = None
...     _compound_vehicle_classes = {}
... 
...     def __init__(self, model, speed=None, length=None):
...         self.model = model
...         self.speed = speed if speed is not None else self.average_speed
...         self.length = length if length is not None else self.average_length
...
...     def __repr__(self):
...         return f'{self.__class__.__name__}(model={self.model!r}, speed={self.speed}, length={self.length})'
... 
...     def __add__(self, other):
...         if not isinstance(other, Vehicle):
...             return NotImplemented
...         cls_a = self.__class__
...         cls_b = other.__class__
...         if (cls_a is cls_b):
...             cls = cls_a
...         elif False:
...             # exercise to reader: what if cls_a or cls_b is already
...             # a compound vehicle class?  You could still resolve this
...             # by checking the __mro__ of each class, for example; you
...             # could also use this to combine a third or even fourth
...             # type of vehicle into some kind of Voltron ^_~
...             pass
...         else:
...             key = (cls_a, cls_b)
...             if key in self._compound_vehicle_classes:
...                 cls = self._compound_vehicle_classes[key]
...             else:
...                 cls = type(cls_a.__name__ + cls_b.__name__,
...                            (cls_a, cls_b),
...                            {'average_length': (cls_a.average_length + cls_b.average_length) / 2,
...                             'average_speed': (cls_a.average_speed + cls_b.average_speed) / 2})
...                 self._compound_vehicle_classes[key] = cls
...         return cls(self.model + other.model, speed=(self.speed + other.speed) / 2,
...                    length=(self.length + other.length) / 2)
... 
>>> class Car(Vehicle):
...     average_speed = 60
...     average_length = 5
... 
>>> class Plane(Vehicle):
...     average_speed = 300
...     average_length = 10
... 
>>> 
>>> class Boat(Vehicle):
...     average_speed = 20
...     average_length = 100
... 
>>> car = Car('Tesla')
>>> plane = Plane('Boeing')
>>> boat = Boat('Evergreen')
>>> carplane = car + plane
>>> carplane
CarPlane(model='TeslaBoeing', speed=180.0, length=7.5)
>>> planecar = plane + car
>>> planecar
PlaneCar(model='BoeingTesla', speed=180.0, length=7.5)
>>> car + boat
CarBoat(model='TeslaEvergreen', speed=40.0, length=52.5)

【讨论】:

  • 谢谢你的帮助,但这不太对,你从班级算平均速度,但如果你添加数据,他们不会被计算在内。我不太明白该怎么做
  • car = Car("Tesla", speed=100, length=4) plane = Plane('Boeing', speed=100, length=8) carplane = car + plane print(carplane.average_speed) print(carplane.average_length)
  • @Heyit'sSerge:如果把两辆不同型号的车加在一起,新车的型号应该是什么?另外,我想知道您是否将加法与就地组合混为一谈。这是两个非常不同的东西。
  • 这里不是很清楚你想要什么。在您的(不起作用的)代码中,您将average_speed 设置为类属性,至少在某些情况下,您将其用作车辆的默认速度。我会称它为default_speed,但它也可以被视为汽车的“平均速度”等等。当您添加汽车和飞机时,新的 CarPlane 有一个 speed,这是 car.speedplane.speed 的平均值。我不知道您希望它具有什么其他价值。
猜你喜欢
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2021-12-23
  • 2019-12-25
  • 1970-01-01
相关资源
最近更新 更多