从 Python 的魔法方法说开去

从 Python 的魔法方法说开去

💡 原文中文,约2300字,阅读约需6分钟。
📝

内容提要

本文探讨了Python中的魔法方法,特别是`__next__()`的行为。分析`popen()`返回的对象发现其为可迭代但不是迭代器。动态修改实例的魔法方法无效,需修改类的方法。讨论了通过元类实现魔法方法的可能性,但`__getattr__()`并不影响迭代器的判断。Python的特性常令人惊讶。

🎯

关键要点

  • popen()返回的对象是_wrap_close,属于可迭代对象但不是迭代器。
  • 动态修改实例的魔法方法无效,必须修改类的方法才能生效。
  • 魔法方法的调用基于类是否定义了该方法,而不是对象本身。
  • 通过元类的__getattr__()方法无法使类获得本不属于它的魔法方法。

延伸问答

popen()返回的对象是什么类型?

popen()返回的对象是_wrap_close,属于可迭代对象但不是迭代器。

为什么动态修改实例的魔法方法无效?

动态修改实例的魔法方法无效,因为必须修改类的方法才能生效。

如何判断一个对象是否是迭代器?

判断一个对象是否是迭代器是基于其类是否定义了__next__()方法,而不是对象本身。

通过元类能否让类获得本不属于它的魔法方法?

通过元类的__getattr__()方法无法使类获得本不属于它的魔法方法。

为什么r.__next__()能调用成功?

因为_wrap_close定义了__getattr__()方法,所有找不到的属性会传递给其内部的_stream对象,而_stream对象有__next__()方法。

如何修改类的魔法方法以改变实例的行为?

要改变实例的行为,必须直接修改类的方法,而不是尝试动态修改实例的方法。

➡️

继续阅读