使用Python覆盖属性

时间:2010-11-05 16:37:59

标签: python inheritance

如何在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

但是getter正在调用Vehicule而不是Car的方法。

我应该改变什么?

2 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:2)

这可能会有所帮助:python properties and inheritance