通过 super() 调用父类 setter 时出错 - 更好的解决方案? [重复]

问题描述 投票:0回答:0

以下 python-3.x 代码出错。我的问题是

  1. 为什么不起作用?
  2. 有什么好的解决方法吗? 有 workaround,但看起来不是 pythonic。有没有更好的解决方案?

class Parent(object):
    def __init__(self, v):
        self.val = v # [1] use the setter.

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

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

class Child(Parent):
    def __init__(self, v):
        super().__init__(v)

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

    @val.setter
    def val(self, v): # override parent's setter
        super().val = v # [2] super() to use parent's setter

a = Child(0)

这以错误结束

AttributeError: 'super' object has no attribute 'val'
.

修复?

我发现的解决方法是: 1按照派生类中的属性被覆盖,如何调用基类的属性?解决方案,显式调用getset

这似乎可行。上面的代码将是;

    @property
    def val(self):
        return super(Child, self.__class__).val.__get__(self)

    @val.setter
    def val(self, v): # override parent's setter
        super(Child, self.__class__).val.__set__(self, v)

Overriding 是派生类的基本用途之一,setter/getter 的使用是为了使您的代码直观。但这里的解决方案远非直观。任何 pythonic 解决方案?

python-3.x properties setter super
© www.soinside.com 2019 - 2024. All rights reserved.