我遇到了这个问题,例如,我定义了一个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
非常感谢任何帮助,在此先感谢。
答案 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
属性。