为什么Python的生成器不是类型?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么Python的生成器不是类型?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2590字,纯文字阅读大概需要4分钟。
内容图文
![为什么Python的生成器不是类型?](/upload/InfoBanner/zyjiaocheng/753/ca5332652f6c4c319ff280f09b49a332.jpg)
问题的简短版本:为什么生成器实例的类型不是创建实例的生成器函数?也就是说,如果我们有一个生成器,比如def G():yield 1和g是由G创建的生成器实例,即g = G(),那么为什么type(g)是G false?
细节:
我最近问了一个关于如何确定给定生成器对象的生成器类型的问题. (见In Python, is there any way to test a generator object to find out which generator created it?.)答案最终要求使用__name__.但是,这仍然给我一个未解答的问题:为什么生成器不是Python中的类型?
下面的所有代码都考虑到了Python 3.3,但我相信大多数代码都适用于旧版本的Python(至少2.7版本)和更新版本,即3.4版本.
让我们看一个非常简单的迭代器示例,该迭代器首先作为类实现:
class C(object):
def __iter__(self):
return self
def __next__(self):
return 1
c = C()
print(next(c)) # 1
print(type(c)) # <class '__main__.C'>
print(type(c) is C) # True
在功能上,上面的类与下面给出的生成器相同. (当然,我们缺少投掷,发送和关闭,还有其他微妙的差异,但我认为它们与手头的问题无关.)
def G():
while True:
yield 1
g = G()
print(next(g)) # 1
print(type(g)) # <class 'generator'>
print(type(g) is G) # False
但正如您所看到的,使用def和yield定义的生成器创建的对象类型以及使用类创建的迭代器的处理方式完全不同.所有生成器实例都被赋予泛型类型生成器.对我来说,这类似于被赋予泛型类型的类创建的所有对象,比如对象,当然不是这种情况.
Python总体上是一种非常一致和逻辑的语言.特别是,Python对类型的处理非常一致:对象的“创建者”成为它的类型.即使使用元类,这也很好用:
class M(type):
def __new__(cls, *args):
return super().__new__(cls, *args)
class C(metaclass=M):
pass
c = C()
print(type(c) is C) # True
print(type(C) is M) # True
print(type(M) is type) # True
print(type(type) is type) # True
你可以在这里看到类型(c)是C,因为c是由C创建的,而类型(C)是M,因为类对象C是由元类M创建的,最后M本身是一个由对象创建的类对象.元类型.我们甚至有类型(类型)是类型,作为自引用,它为类型层次结构提供根.
但是,对于生成器,我觉得这种一致性被打破了.在上面,当我们有g = G()时,对象g实际上是由G创建的.它的类型是否应该设置为等于G?或者,对于我未能看到的所有生成器实例选择泛型类型有更深层次的原因吗?
解决方法:
In particular, Python’s treatment of types is very consistent: the “creator” of an object becomes its type.
这仅适用于课程.并非创建对象的所有内容都是类:
type(open('whatever')) is not open
type(iter(whatever)) is not iter
type(compile('whatever')) is not compile
生成器函数是函数,而不是类.你不能对它进行子类化,或者在它上面定义方法,或者让它从某些东西继承,或者改变它的元类,或者做几乎你可以用真实类做的任何事情.学习创建生成器的函数不会改变与它交互的方式,就像学习对象类改变了与对象交互的方式一样.与不同的类不同,无论创建生成器的函数是什么,它都提供完全相同的API.
简而言之,生成函数类型而不是函数没有任何好处.
内容总结
以上是互联网集市为您收集整理的为什么Python的生成器不是类型?全部内容,希望文章能够帮你解决为什么Python的生成器不是类型?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。