Python 覆盖子类中的类属性而不是方法

Python 覆盖子类中的类属性而不是方法,python,class,oop,inheritance,Python,Class,Oop,Inheritance,我有这个问题,例如我定义了一个车辆类 class Vehicle(): speed = 0 def __init__(self): pass def get_speed(self): return Vehicle.speed 我有一个class属性speed,我将在Bike子类中覆盖它 class Bike(Vehicle): speed = 20 如果我实例化一个类型为Bike的新对象,我会得到 >>> a =

我有这个问题,例如我定义了一个
车辆

class Vehicle():
    speed = 0
    def __init__(self):
        pass
    def get_speed(self):
        return Vehicle.speed
我有一个class属性
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

任何帮助都将不胜感激,提前感谢。

如果您需要
get\u speed
成为类范围的属性(而不是实例范围),您可以使用
@classmethod
装饰器:

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

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

但是仍然可以在类实例中重写
speed
属性。

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

这就是为什么您可以简单地执行以下操作:

>>> class Vehicle:
...     speed = 0
...     def get_speed(self):
...         return self.speed
...     
>>> class Bike(Vehicle):
...     speed = 20
...     
>>> a = Bike()
>>> a.get_speed()
20
此外,我将摆脱那种
get\u speed
方法。编写getter和setter不是惯用的Python。只需使用
a.speed


如果要保护属性不被设置,请考虑使用.< /P>有点依赖。在你的设计中,同一级别的所有车辆都有相同的速度吗,或者可以说两辆自行车有不同的速度吗?所有的自行车都有相同的速度,我将制作另一个子类,比如car,所有的汽车都有相同的速度,比如说30,谢谢你这么快的评论。在这种情况下,只需将

返回车辆。速度
更改为
返回自我。速度
即可。非常感谢Pavel这么快的回答。非常感谢timgeb,我要去重构我的代码。