覆盖类属性,但不覆盖子类中的方法

时间:2020-05-31 14:53:28

标签: python class oop inheritance

我遇到了这个问题,例如,我定义了一个Vehicle类。

class Vehicle():
    speed = 0
    def __init__(self):
        pass
    def get_speed(self):
        return Vehicle.speed

我有一个类属性speed,它将在Bike子类中覆盖

class Bike(Vehicle):
   speed = 20

如果我实例化类型为Bike的新对象,我会得到这个

>>> a = Bike()
>>> a.get_speed()
0

如何获取它而不必重写父类方法。

>>> a.get_speed()
20

我确实有一个解决方案,但是我不知道这是否是一种好的编程习惯,因为实例变量对于该实例应该是唯一的,所以现在我非常困惑。

class Vehicle():
   def __init__(self):
      self.speed = 0

   def get_speed(self):
      return self.speed

class Bike(Vehicle):
   def __init__(self):
      self.speed = 20

我应该将其重新声明为实例变量,以便在构造函数中覆盖self.speed = 20时得到

>>> a = Bike()
>>> a.get_speed()
20

非常感谢任何帮助,在此先感谢。

2 个答案:

答案 0 :(得分:3)

如果在对象的__dict__中找不到属性,即当它不是实例属性时,Python将在下一个类中查找该属性。

这就是为什么您可以简单地这样做:

>>> class Vehicle:
...     speed = 0
...     def get_speed(self):
...         return self.speed
...     
>>> class Bike(Vehicle):
...     speed = 20
...     
>>> a = Bike()
>>> a.get_speed()
20

此外,我将摆脱该get_speed方法。编写getter和setter并不是惯用的Python。只需使用a.speed

如果要防止设置属性,请考虑使用properties

答案 1 :(得分:2)

如果您需要get_speed作为类范围的属性(而不是实例范围的属性),则可以使用@classmethod装饰器:

class Vehicle():
    speed = 0
    def __init__(self):
        pass

    @classmethod
    def get_speed(cls):
        return cls.speed

尽管如此,仍然可以在类实例中覆盖speed属性。