2010-11-05 110 views
6

如何覆盖Python中属性的getter?使用Python覆盖属性

我试图做的事:

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的方法,而不是汽车。

我应该改变什么?

+0

这个问题将是一个容易得多,如果我们可以用'Vehicule',而不是'超(汽车,个体经营)'。是否使用“超级”命令? – unutbu 2010-11-05 18:15:25

+0

你是什么意思?你可以给我一个例子吗 ? – 2010-11-05 18:37:41

回答

3

它看起来像你想要租车的空间属性的getter调用驱动车辆的 空间属性的getter。您可以通过

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 

另一方面,从Car的二传手中调用Vehicule的二传手更加困难。 显而易见的事情不工作:

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 
+0

我正在使用Google App Engine,并且不支持@ spatials.setter语法。 – 2010-11-05 19:19:17

+0

@Pierre:哦,好吧,我会改变我的答案,使用旧的语法。 – unutbu 2010-11-05 19:31:05

+0

谢谢unutbu。如果你想在getter中使用参数,你可以在Car中的getter中使用super(Car,self)._ getSpatials(params)。 – 2010-11-05 20:07:38