【问题标题】:How doI compare two classes that have inheritance?如何比较两个具有继承的类?
【发布时间】:2021-12-13 00:45:34
【问题描述】:

好吧,假设我有两个子类和一个父类。我将如何比较两个子类之间的异同?例如

class vehicles:
    def __init__(self, make, model):
        self.make = make
        self.model = model
class truck(vehicles):
    def __init__(self, make, model):
        vehicles.__init__(self, make, model)
        self.make = "ford"
        self.model = "F-150"
class cars(vehicles):
    def __init__(self, make, model):
        vehicles.__init__(self, make, model)
        self.make = "ford"
        self.model = "mustang"

如何让它打印两个子类在这里的共同点?我不知道从哪里开始。我查看了其他网站并阅读了我的 python 书,但我找不到它向我展示如何做到这一点的地方,或者我只是不理解它。我要比较的是品牌和型号的反对意见。我不知道我不需要额外的自我。但我仍然不确定在这里做什么。

【问题讨论】:

  • 根据您自己的研究,到目前为止您尝试了哪些方法,您的尝试中出了什么问题?请edit 在您的比较代码中包含minimal reproducible example
  • 我无法提供一个最小的可重现示例,因为我不知道从哪里开始,或者即使我试图做的事情对于这种数据类型是可能的。这就是为什么我要问怎么做。
  • 你到底想比较什么(值或属性还是什么?比较是基于父类具有的属性吗?所以只比较继承属性的值?),除了两个子类你不需要使用self.makeself.model,只需将参数传递给父__init__方法,否则继承有什么意义?
  • 好吧,我不知道。那么我该怎么做才能给对象赋值呢?
  • @reagent-52 在您的情况下,在继承类的__init__ 方法中使用此特定代码,您只需键入vehicles.__init__(self, "ford", "mustang") 和其他vehicles.__init__(self, "ford", "F-150"),此外没有意义为用户放置参数,因为它们将被覆盖

标签: python


【解决方案1】:

您可以为Vehicle(根据 PEP 8 约定调整名称)类创建一个方法(因为它是基类,因此继承类将继承此方法),它将比较模型和自身的制造以及模型和制造传递的参数(这里的比较意味着它只会返回分组在一个元组中的两个参数,因为您没有指定如何精确比较):

class Vehicle:
    def __init__(self, make, model):
        self.make = make
        self.model = model

    def compare_make_model(self, other):
        if isinstance(other, Vehicle):
            return (self.make, other.make), (self.model, other.model)
        else:
            raise TypeError(f'Expected Vehicle got \'{type(other).__name__}\' instead')


class Truck(Vehicle):
    pass


class Car(Vehicle):
    pass


f150 = Truck('ford', 'F-150')
mustang = Car('ford', 'mustang')

print(f150.compare_make_model(mustang))

如您所见,子类继承了此方法,并且可以在它们上使用它来比较品牌和型号。此外,正如您所注意到的,CarTruck 无需执行任何操作,因为实际上没有添加任何新行为,因此所有内容都被继承(因此目前创建这两个子类确实没有意义,但我想您会添加一些稍后的其他行为)。

还有:
我强烈建议关注PEP 8 - Style Guide for Python Code。函数和变量名应该在snake_case,类名在CapitalCase。在函数和类声明周围有两个空行。类方法周围有一个空行。

来源:

【讨论】:

  • 好的,谢谢。我还有另一个问题,但我认为在这里问比创建一个全新的问题更好。假设我有一个像你上面所做的继承类的列表。除了将它们放在打印函数中之外,还有什么方法可以打印各个类名?比如说我想打印通往卡车课程的课程?我该怎么做?
  • 是的,这可能就是我要找的东西,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
相关资源
最近更新 更多