是否可以覆盖超类的属性设置器而无需重新定义属性

Ric*_*ann 2 python inheritance properties getter-setter python-3.x

我有类,使用相同的getter共享相同的属性,但是不同的setter.作为一个简单,无用的例子,类似于:

class Spam():
    @property
    def foo(self):
        return self.bar

    @foo.setter
    def foo(self, foo):
        self.bar = foo


class Eggs(Spam):
    @foo.setter
    def foo(self, foo):
        self.bar = ' '.join(['Egg\'s foo:', foo])
Run Code Online (Sandbox Code Playgroud)

但是,尝试运行此模块会引发以下错误:

Traceback (most recent call last):
  File "./test.py", line 13, in <module>
    class Eggs(Spam):
  File "./test.py", line 14, in Eggs
    @foo.setter
NameError: name 'foo' is not defined
Run Code Online (Sandbox Code Playgroud)

为了使这项工作符合要求,我需要重新定义Eggs.foo:

class Eggs(Spam):
    @property
    def foo(self):
        return super().foo

    @foo.setter
    def foo(self, foo):
        self.bar = ' '.join(['Egg\'s foo:', foo])
Run Code Online (Sandbox Code Playgroud)

有没有办法避免重新定义属性?因为如果你像我这样在几个子类中有很多这样的getter和setter,这非常烦人.

Ash*_*ary 6

您还需要指定类名:

class Eggs(Spam):
    @Spam.foo.setter
    def foo(self, foo):
        self.bar = ' '.join(['Egg\'s foo:', foo])
Run Code Online (Sandbox Code Playgroud)

  • @zacharmarz `super(Eggs, type(self)).foo.fset(self, val)` ? (2认同)