在子类化时用属性替换 getter 和 setter

Replacing getters and setters with properties while subclassing

我正在使用 WxPython - Python 的 GUI 库。这个库的几乎所有属性都是通过 getter 和 setter 处理的,例如 Frame.GetNamePanel.SetBackgroundColour。它的 Python 3 端口(名为 Phoenix)也是如此。 WxPython 提供的小部件通常通过子类化它们并覆盖它们的 getter 和 setter 来使用。该库还提供 类 来创建新的小部件,目前我正在尝试创建一个。

问题是:用属性替换这个getter/setter模式可以吗?毫无疑问,这是可能的,但我应该这样做吗?这将产生以下冲突:

这是一个例子:

# Say, I made a widget called FancyButton. Here's the aftermath:
mybutton = FancyButton()
mybutton.SetLabel("Quack") # This is legacy code from superclass
mybutton.hover_colour = "Blue" # This is new code with property style

这种设计模式很常见吗?我应该坚持使用 getter 和 setter 吗?

如果您愿意,您还可以在子class 中为基础 class 的 getters/setters 添加属性。属性非常 Pythonic,但不是非常高性能。此外,当你必须像 __getattr__ 那样施展魔法时,它们的效果并不好,但我经常使用它们。

避免使用它们的唯一真正原因是它们是否会让用户感到困惑——例如,因为事情发生了他没有预料到的变化,或者因为它们所花费的执行时间。