问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

各位有没有详细讲Python泛型的资料

发布网友 发布时间:2022-04-18 03:09

我来回答

1个回答

热心网友 时间:2022-04-18 04:39

我们开始真正地讨论Python3000了。这里有一个新的邮件列表和一个版本分支。首要的问题是关于流程的。Python 增强建议书(Python Enhancement Proposal,简称PEP)的很多新格式正在制定,目的是为了避免重蹈Perl 6的覆辙:-)。我在blog一个关于功能的提案,这个提案在过去一段时间里已经发生了很大的变化)
自盘古开天地之日起,Alex Martelli就一直是配接的忠实拥护者。他经常埋怨我对配接的光芒视而不见。现在,我为自己当时的不开窍而感到庆幸。
我先用最简单的形式来介绍一下配接吧。 这个想法诞生于一种常有的情况:需要用到对象包装器(object wrapper)[贴切地命名为配接器模式(Adapter Pattern)]。PEP246打算提供一个内置的函数adapt(X, P), X可以是任何对象,而P也可以是任何Protocol。我们故意不对protocol进行定义,只要它可以通过对象表现出来就可以。调用adapt(X, P)返回一个由X构建并满足P的对象,如果创建对象失败,则抛出一个异常。它使用全局注册表(global registry)为配接器功能提供了类型和protocol之间的映射关系。我们可以写为dict R = {(T, P): A, ...}。然后,adapt(X, P) 计算出adapter A = R[type(X), P],并返回A(X)。 还有一个注册函数register(T, P, A),它简单地设置 R[T, P] = A。请参见Alex更为精彩的解释,他补充了很多我遗漏掉的东西。
当Alex提出他对配接工作原理的这一看法,好几个人(包括我自己在内)都意识到全局注册表是没有必要的。每个protocol都可以有自己的注册表(registry)。所以,现在我们在protocol上使用adapt()和register()方法。我们使用P.adapt(X)而非adapt(X, P),使用P.register(T, A)而非register(T, P, A)。A的签名(signature)保持不变。我称之为第二代配接(second-generation adaptation)。
这样做的好处是你们再也不用局限于一种固定的全局的register()和adapt()实现。Alex提到了很多他忽略的问题,但是如果要真正实现,这些问题需要得以解决。例如,如何处理对象类型未被注册而一些基本类型已被注册的配接,protocol之间的继承是如何定义的(当你把protocol和接口等同起来时会很有用,就像Zope和Twisted一样),对象已实现protocol/接口时的自动检测(这在Zope和Twisted中有用)。一些扩展(extension)有在查找(lookup)的性能上有问题,我们可以通过几种不同的方法来解决。通过多重协议实现(multiple protocol implementations)(每次都实现相同的adapt()和register() APIs),每个框架(framework)都对配接如何为其自身拥有的protocol服务有自己的主张,而没必要使用一个固定的全局实现。对于一个特定的框架而言,配接的全局实现可能达到最佳效果,但也未必就是最好的选择。
Ian Bicking提出了一个对立的观点:我们为什么不使用泛型函数而非配接呢?他和Phillip Eby都认为泛型函数具有的功能比配接器更强大,至少在某种程度上差不多。现在我就来简要说一下泛型函数。
一个泛型函数G,可以被调用,这种行为类似一个普通函数(取参数并返回一个值),但其实现是可扩展的(extensible),并可以在不同的模块中进行定义。TG包含一个由复合类型参数的元组索引的注册表实现。假设我们想让具有两个参数的G可调用,那么注册表将会把成对了类型组(type pairs)映射到实现的函数中。我们可以使用G.register((T1, T2), F) 来显示地定义,当type(X1)==T1、type(X2)==T2时,F(X1, X2)是G(X1, X2)的合适的实现。 最简单的实现就是把参数映射到它们的类型(类或许更好),转换为元组,并利用它作为注册表的键值来找到实现函数。如果没有找到健值,就调用缺省实现,前提是预先定义G,并提供一些回调或抛出一个异常。
一个有用的泛型函数实现也必须支持在参数类型的基本类型上查找匹配。这就是使事情变得复杂的地方,特别是当你有多个参数时。例如,你有一个实现方案,它与第一个参数完全匹配,基本类型与第二个参数匹配;另一个实现方案是,它与第二个参数完全匹配,基本类型与第一个参数匹配。这种情况下,你会选择哪一种?Phillip Eby的实现、RuleDispatch (part of PEAK) 拒绝做出猜测; 如果没有占优势的实现方案(不管它是什么意思),都会抛出异常。你可以通过注册一个更加具体的签名来彻底解决问题。
C++用户会认为泛型函数是一个C++编译器用来解决函数重载问题的策略的运行时实现。幸运的是,我们不需要与C向后兼容,从而避免了重蹈C++的错误(如,导致浮点类型的优先级高于布尔类型)。Lisp或 Dylan用户(不知是否还存在:-),以及PyPy 开发者会认为它们是多重方法(multi-methods)。
为了对比上述两种观点,我提出了一个关于配接和泛型函数的一个简单版本,通过这一版本来再现内置iter()函数的重复实现。我在注册表中使用了描述符,这使得签名与我上面所述有一些轻微的差别,但实质是一样的。
胜负分晓了
现在我们已经为庆祝时刻做好准备了。Tim Hochberg独立开发的一个可以替代的Protocol版本给我们带来了这一欢乐时刻。P.adapt(X)只是泛型函数G(x) 调用的另外一种冗长形式罢了。
有趣的是,Alex费了一些周折才开始喜欢上它。他过去一直认为配接的功能更强大,因为配接可以返回实现多个方法的对象,而泛型函数要实现同样的功能则要求每个方法都有一个单独的泛型函数。当然,我们可以使用泛型工厂函数(generic factory function),它可以像adapt()一样返回带有多个方法的对象。泛型函数在“单点”protocol(常见)--一个方法只有一个马上调用就可以获得想要的结果接口--的情况下占优势。在使用配接时,这可能要求每个配接器使用一种单一方法的辅助类(helper class),辅助类(helper class)来完成预期的运行。在使用泛型函数时,泛型函数则可以完成运行。我们还没有在多个参数上使用过泛型函数分派。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你好, 我把内存卡用读卡器插上了,然后电脑显示需要格式化 说检查磁盘... 专科,机电一体化专业的如果考公务员的话,应该做哪些准备 pe塑料菜板好不好-pe塑料菜板用之前应该怎么处理 ...50吨的速度往一艘轮船上装载物资,10小时装载完毕. 码头工人以每天50吨的速度往一艘轮船上装载货物,装载完毕恰好用了8天时... 农历三月初三有什么说法 农历的三月三日是什么意思 第九所攻略大全 新手入门少走弯路-新手攻略-安族网 第九所新手怎么玩介绍_第九所新手怎么玩是什么 《第九所史实》:解锁全新篇章的神秘密码大揭秘! 划重点!特殊时期的狗狗如何喂食? 掉毛严重的猫排行榜是怎样的? 做环评和环境工程哪个好? 辽宁华晨石油化工有限公司怎么样? 不止一次 我努力尝试作文600初一 最强的猫.老鼠是哪些? 如何查询申请时间 为什么走了一万多步才收到一g能量? 哈尔滨华春药化环保技术开发有限公司怎么样? 环境工程是个垃圾专业吗 怎么看是哪一年注册的 环境工程就业 ipadair2不能识别卡重装系统行不行 华新环境工程(应城)有限公司怎么样? 环境工程就业真的很差? ipad在mac上不显示为u盘 环境工程好不好? 什么时候注册的在哪里看 信阳职业技术学院医学院的学校简介 怎么看自己的什么时候注册的 买房向银行贷款20万 按揭是15年 如果我提前10年还清 银行利息怎么帮我计算 在银行贷款买房,十年好还是十五年好,?利息怎么算,十五年利息比十年的利息多吗?要怎样减少利息? 观察小狗怎样吃东西日记 联想电脑显示内存不足 我是联想的电脑,512M内存,电脑最近老是提示内存不足和虚拟内存太低 物理中stv代表什么 滑轮组中v=st是什么意思? 联想笔记本电脑,窗口打开多了以后就会变得很慢,还会提示虚拟内存不足,怎么办啊? 速度的计算公式:v=stv=st,它的单位:__ 计算速度的公式是stst,其中s表示___,t表示___,v表示___ 速度表示物体______ 的物理量,它等于运动物体在______内通过的路程,公式表达为:v=stv=st,在国际单 物理学中把物体在单位时间内通过的路程叫速度,速度计算公式为:速度=路程时间路程时间,即v=stst,单位 在物理中为什么v=st则h=vt? 在物理学中,把路程与时间之比叫做______,写成公式就是v=stv=st.我们把物体沿着直线且速度不变的运动叫 对平均速度定义式.v=st的理解,下列说法正确的是(  )A..v=st求出的是t时刻的速度B.此公式只适用于 在物理学中s=vt中的s、v、t各表示什么意思? 在物理学中s=vt中的s,v,t各表示什么意思 微信群发好用吗? 能判断是真假阿胶糕么? 婚假包含周末吗?