python属性和继承

时间:2014-09-17 21:33:30

标签: python inheritance properties

如果我在基类中定义一个属性(带有@property),我如何在子类中覆盖此属性的setter?

更具体地说:

如果我创建了一个A类:

class A(object):
   def __init__(self, val):
       self._val = val

   @property
   def val(self):
       return self._val

   @val.setter
   def val(self, value):
       self._val = value

并创建A

的子类B.
class B(A):
    def __init__(self, val):
        super(B, self).__init__(val)

如何防止在B上调用setter?

有没有办法写出相当于:

class B(A)
    def __init__(self, val):
        super(B, self).__init__(val)

    @val.setter
    def val(self, value):
        raise ValueError("cannot set value on B")

实际上,上面的代码会引发:

NameError: name 'val' is not defined

是否有必要在B中重新定义thre getter才能使其正常工作?

如果我写:

class B(A):
    def __init__(self, val):
        super(B, self).__init__(val)

    @property
    def val(self):
        return self._val

     @val.setter
     def val(self, value):
         raise AttributeError("cannot set val of B")

一切正常...... 有没有解决办法?

0 个答案:

没有答案