💡
原文中文,约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__()方法。
如何修改类的魔法方法以改变实例的行为?
要改变实例的行为,必须直接修改类的方法,而不是尝试动态修改实例的方法。
➡️