Python 工匠:案例、技巧与工程实践
朱雷
蓝鲸工具 PaaS 平台负责人
502 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
时长 21:38
免费
课程目录
已完结/共 20 讲
时长 21:38
时长 33:20
时长 24:04
时长 29:57
时长 00:56
时长 00:39
时长 00:36
Python 工匠:案例、技巧与工程实践
15
15
1.0x
00:00/00:00
登录|注册

第 9 章 面向对象编程(2)

9.3 编程建议

9.3.1 使用 __init_subclass__ 替代元类

在前面介绍元类时,我提到强大的元类有许多替代工具,它们比元类更简单,可以涵盖元类的部分使用场景。__init_subclass__ 方法就是其中一员。
__init_subclass__ 是类的一个特殊钩子方法,它的主要功能是在类派生出子类时,触发额外的操作。假如某个类实现了这个钩子方法,那么当其他类继承该类时,钩子方法就会被触发。
我用 8.2.2 节中的例子来演示如何使用 __init_subclass__。在那个例子中,我通过类装饰器实现了自动注册 Validator 子类的功能。其实,这个需求完全可以用 __init_subclass__ 钩子方法来实现。
在下面的代码里,我定义了一个有子类化钩子方法的 Validator 类:
class Validator:
"""校验器基类:统一注册所有校验器类,方便后续使用"""
_validators = {}
def __init_subclass__(cls, **kwargs):
print('{} registered, extra kwargs: {}'.format(cls.__name__, kwargs))
Validator._validators[cls.__name__] = cls
接下来,再定义一些继承了 Validator 的子类:
class StringValidator(Validator, foo='bar'): ➊
name = 'string'
class IntegerValidator(Validator):
name = 'int'
print(Validator._validators)
❶ 子类化时可以提供额外的参数
执行结果如下:
StringValidator registered, extra kwargs: {'foo': 'bar'} ➊
IntegerValidator registered, extra kwargs: {}
{'StringValidator': <class '__main__.StringValidator'>, 'IntegerValidator': <class '__main__.IntegerValidator'>} ➋
❶ 父类的钩子方法被触发,完成子类注册并打印参数
❷ 完成注册
通过上面的例子,你会发现 __init_subclass__ 非常适合在这种需要触达所有子类的场景中使用。而且同元类相比,钩子方法只要求使用者了解继承,不用掌握更高深的元类相关知识,门槛低了不少。它和类装饰器一样,都可以有效替代元类。

9.3.2 在分支中寻找多态的应用时机

多态(polymorphism)是面向对象编程的基本概念之一。它表示同一个方法调用,在运行时会因为对象类型的不同,产生不同效果。比如 animal.bark() 这段代码,在 animalCat 类型时会发出“喵喵”叫,在 animalDog 类型时则发出“汪汪”叫。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了面向对象编程中的一些技术特点和最佳实践。首先介绍了使用`__init_subclass__`方法替代元类的应用场景和优势,并通过示例演示了如何实现子类的注册和参数传递。其次,讨论了多态的应用时机,以及如何利用多态简化代码和提高扩展性,通过`FancyLogger`类的例子说明了多态的优势。最后,强调了有序组织类方法的重要性,并给出了一些建议,如将`__init__`方法放在类的最前面,公有方法放在前面等。此外,文章还提到了Python中函数搭配面向对象代码可以实现许多功能,如降低API使用成本和实现“预绑定方法模式”。总的来说,本文通过具体的例子和建议,帮助读者更好地理解面向对象编程中的一些技术特点和最佳实践。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 工匠:案例、技巧与工程实践》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
大纲
固定大纲
9.3 编程建议
9.3.1 使用 __init_subclass__ 替代元类
9.3.2 在分支中寻找多态的应用时机
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部