擅长:python、mysql、java
<p>在<code>itertools.repeat</code>(以及大多数迭代器)的情况下,使用一个实现<code>iterator</code>协议的适当类具有实现/维护POV的一些优势,比如可以更好地控制迭代,你可以对类进行专门化等等,我也怀疑在C级可以对不适用于生成器的适当迭代器进行一些优化。在</p>
<p>还要记住,类和函数也是对象,<code>def</code>语句主要是用来创建<code>function</code>实例并用编译代码、本地名称空间、单元格、闭包和其他内容填充它的语法糖(这是一个涉及到某种程度的任务FWIW,出于好奇,我曾经做过一次,这是一个主要的PITA),而且<code>class</code>语句也是创建一个新的<code>type</code>实例的语法糖(手动操作实际上非常简单)。从这个观点来看,<code>yield</code>是一种类似的语法糖,它将您的函数转换成一个工厂,返回泛型<code>generator</code>内建类型的实例—这样可以使您的函数像类一样工作,不需要编写完整类的麻烦,也不需要通过编写完整的类来进行精细的控制和可能的优化。在</p>
<p>在更一般的层面上,有时把你的“函数”写成一个定制的可调用类型反而能带来类似的好处——精细的控制,可能的优化,有时只是更好的可读性(想想两步修饰符、自定义描述符等)。在</p>
<p>最后wrt/builtin types(<code>int</code>,<code>str</code>等等)IIRC(如果我错了,请有人纠正我)它们最初是充当工厂函数的函数(在新型类革命之前,当内置类型和用户定义类型是不同种类的对象时)。当然,现在将它们作为普通类是有意义的,但是为了兼容性,它们必须保留所有较低的命名方案。在</p>