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,我要去重构我的代码。