返回介绍

重访多态

发布于 2024-01-29 22:24:16 字数 1089 浏览 0 评论 0 收藏 0

和所有的Python中的函数一样,intersect是多态的。也就是说,它可以支持多种类型,只要其支持扩展对象接口:

这次,我们给的函数传递了不同类型的对象[一个列表和一个元组(混合类型)],并且仍然是选择出共有的元素。因为你没有必要去定义预先定义参数的类型,这个intersect函数很容易对传递给它的任何序列对象进行迭代,只要这些序列支持预期的接口就行了。

对于intersect函数,这意味着第一个参数必须支持for循环,并且第二个参数支持成员测试。所有满足这两点的对象都能够正常工作,与它们的类型无关——这包括了物理存储的序列,例如,字符串和列表。所有在第14章见到过的迭代对象,包括文件和字典;甚至我们编写的支持操作符重载技术的任意基于类的对象(之后我们将会在第六部分讨论这一点)[1]

这里再一次强调,如果我们传入了不支持这些接口的对象(例如,数字),Python将会自动检测出不匹配,并抛出一个异常——这正是我们所想要的,如果我们希望明确地编写类型检测的话,我们利用它来自己实现。通过不编写类型测试,并且允许Python检测不匹配,我们都减少了自己动手编写代码的数量,并且增强了代码的灵活性。

[1]如果我们把用file.readlines()获取的文件内容相交,这段代码总是有效。然而,如果直接相交打开输入文件中的行,根据文件对象的in运算符和通用迭代的实现的不同,它有可能无法工作。在文件已经有一次读取到文件末尾的时候,文件通常必须重新查找(例如,用一个file.seek(0)或另一个open)。正如我们在第29章中学习运算符重载时候将要看到的,类实现in运算符的时候,要么通过提供特定的__contains__方法,要么通过使用__iter__或较早的__getitem__方法来支持通用迭代协议;如果编码的话,类可以定义对其数据使用何种迭代方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文