python - 是否可以在不需要重新定义属性的情况下覆盖父类(super class)的属性 setter

标签 python inheritance python-3.x properties getter-setter

<分区>

我有类,共享相同的属性和相同的 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])

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

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

为了让这项工作如期进行,我需要重新定义 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])

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

最佳答案

您还需要指定类名:

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

关于python - 是否可以在不需要重新定义属性的情况下覆盖父类(super class)的属性 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28151149/

相关文章:

python - Django 项目的生产设置

Python使用super覆盖属性,传递参数时出现意外的参数错误

python - 与 Python 3 的隐式区分?

python - 我什么时候必须使用 plt.show()?

python - 放入和进入队列的不同对象

python - 有没有办法计算 PyTorch 张量的矩阵对数?

python - 如何检查正在执行的 Python 脚本的哪一行?

c++ - 我可以使用多态性将不同的对象存储在 C++ 的数组中吗?

c# - 选择子类的父方法(C#)

python-3.x - pip 如何告诉 Python 如何导入 C 扩展