我正在尝试扩展 Python 库以添加我想要的功能。该库提供了许多 HTML 表单对象(例如 Textbox、Dropdown、Checkbox 等),它们都派生自 输入对象。我想为所有这些派生对象添加一个附加属性。正确的处理方式是什么?
我可以:
- 修改
Input类的原始源代码,添加我想要的属性。 - 创建一个继承
Input并添加我的属性的新类,然后创建一堆继承Textbox、Dropdown的新类,和我的新Input类。 - 使用属性为
Textbox、Dropdown等创建新类。
解决方案 1 是最简单和最简单的,但本质上是错误的,而其他两个似乎比此任务应要求的工作和代码重复要多得多。
有没有我缺少的解决方案?
请您参考如下方法:
第四个解决方案是猴子补丁,可能是个好主意。在尝试之前,请确保这不会破坏现在或将来的任何东西:
def additional_method(self, arg):
print("hello", arg)
Input.additional_method = additional_method
或简称:
Input.additional_method = lambda self, arg: do_something(arg)
现在所有现有的和 future 的 Input 实例(以及所有 Input 子类的实例)都附加了一个 additional_method。
这也适用于 Input 的任何 future 子类,这些子类在添加方法时可能还不存在,或者您可能没有意识到,因此更好(即更通用) 而不是创建一个替代的继承层次结构,您必须维护它并与上游更改保持同步。
注意:在你因为它包含短语“猴子补丁”而投反对票之前,请考虑猴子补丁不一定是危险的/脆弱的,并且是一流的(如“受人尊敬的” ") 支持多种语言。
