使用Python重写属性
在Python中,怎么重写一个属性的获取方法(getter)呢?
我试过这样做:
class Vehicule(object):
def _getSpatials(self):
pass
def _setSpatials(self, newSpatials):
pass
spatials = property(_getSpatials, _setSpatials)
class Car(Vehicule)
def _getSpatials(self):
spatials = super(Car, self).spatials()
return spatials
但是获取方法却调用了Vehicule类的方法,而不是Car类的方法。
我应该怎么改呢?
2 个回答
2
这可能会对你有帮助:Python中的属性和继承
3
看起来你想让汽车(Car)的空间属性的获取方法去调用车辆(Vehicule)的空间属性的获取方法。你可以这样做:
class Vehicule(object):
def __init__(self):
self._spatials = 1
def _getSpatials(self):
print("Calling Vehicule's spatials getter")
return self._spatials
def _setSpatials(self,value):
print("Calling Vehicule's spatials setter")
self._spatials=value
spatials=property(_getSpatials,_setSpatials)
class Car(Vehicule):
def __init__(self):
super(Car,self).__init__()
def _getSpatials(self):
print("Calling Car's spatials getter")
return super(Car,self).spatials
spatials=property(_getSpatials)
v=Vehicule()
c=Car()
print(c.spatials)
# Calling Car's spatials getter
# Calling Vehicule's spatials getter
# 1
另一方面,从汽车的设置方法中调用车辆的设置方法就比较复杂了。直接的方法是行不通的:
class Car(Vehicule):
def __init__(self):
super(Car,self).__init__()
def _getSpatials(self):
print("Calling Car's spatials getter")
return super(Car,self).spatials
def _setSpatials(self,value):
print("Calling Car's spatials setter")
super(Car,self).spatials=value
spatials=property(_getSpatials,_setSpatials)
v=Vehicule()
c=Car()
print(c.spatials)
c.spatials = 10
AttributeError: 'super' object has no attribute 'spatials'
相反,诀窍是调用 super(Car,self)._setSpatials
:
class Car(Vehicule):
def __init__(self):
super(Car,self).__init__()
def _getSpatials(self):
print("Calling Car's spatials getter")
return super(Car,self).spatials
def _setSpatials(self,value):
print("Calling Car's spatials setter")
super(Car,self)._setSpatials(value)
spatials=property(_getSpatials,_setSpatials)
v=Vehicule()
c=Car()
print(c.spatials)
# Calling Car's spatials getter
# Calling Vehicule's spatials getter
# 1
c.spatials = 10
# Calling Car's spatials setter
# Calling Vehicule's spatials setter
print(c.spatials)
# Calling Car's spatials getter
# Calling Vehicule's spatials getter
# 10