第 9 章 面向对象编程(2)
朱雷
9.3 编程建议
9.3.1 使用 __init_subclass__ 替代元类
在前面介绍元类时,我提到强大的元类有许多替代工具,它们比元类更简单,可以涵盖元类的部分使用场景。__init_subclass__ 方法就是其中一员。
__init_subclass__ 是类的一个特殊钩子方法,它的主要功能是在类派生出子类时,触发额外的操作。假如某个类实现了这个钩子方法,那么当其他类继承该类时,钩子方法就会被触发。
我用 8.2.2 节中的例子来演示如何使用 __init_subclass__。在那个例子中,我通过类装饰器实现了自动注册 Validator 子类的功能。其实,这个需求完全可以用 __init_subclass__ 钩子方法来实现。
在下面的代码里,我定义了一个有子类化钩子方法的 Validator 类:
接下来,再定义一些继承了 Validator 的子类:
❶ 子类化时可以提供额外的参数
执行结果如下:
❶ 父类的钩子方法被触发,完成子类注册并打印参数
❷ 完成注册
通过上面的例子,你会发现 __init_subclass__ 非常适合在这种需要触达所有子类的场景中使用。而且同元类相比,钩子方法只要求使用者了解继承,不用掌握更高深的元类相关知识,门槛低了不少。它和类装饰器一样,都可以有效替代元类。
9.3.2 在分支中寻找多态的应用时机
多态(polymorphism)是面向对象编程的基本概念之一。它表示同一个方法调用,在运行时会因为对象类型的不同,产生不同效果。比如 animal.bark() 这段代码,在 animal 是 Cat 类型时会发出“喵喵”叫,在 animal 是 Dog 类型时则发出“汪汪”叫。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了面向对象编程中的一些技术特点和最佳实践。首先介绍了使用`__init_subclass__`方法替代元类的应用场景和优势,并通过示例演示了如何实现子类的注册和参数传递。其次,讨论了多态的应用时机,以及如何利用多态简化代码和提高扩展性,通过`FancyLogger`类的例子说明了多态的优势。最后,强调了有序组织类方法的重要性,并给出了一些建议,如将`__init__`方法放在类的最前面,公有方法放在前面等。此外,文章还提到了Python中函数搭配面向对象代码可以实现许多功能,如降低API使用成本和实现“预绑定方法模式”。总的来说,本文通过具体的例子和建议,帮助读者更好地理解面向对象编程中的一些技术特点和最佳实践。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 工匠:案例、技巧与工程实践》
《Python 工匠:案例、技巧与工程实践》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论