返回介绍

Python 中的多态

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

就像我们看到的那样,times函数中表达式x*y的意义完全取决于x和y的对象类型,同样的函数,在一个实例下执行的是乘法,在另一个实例下执行的却是赋值。Python将对某一对象在某种语法的合理性交由对象自身来判断。实际上,“*”在针对正被处理的对象进行了随机应变。

这种依赖类型的行为称为多态,我们在第4章介绍过这个术语,其含义就是一个操作的意义取决于被操作对象的类型。因为Python是动态类型语言,所以多态在Python中随处可见。实际上,在Python中每个操作都是多态的操作:print、index、*操作符,还有很多。

这实际上是有意而为的,并且从很大程度上算作是这门语言的简易性和灵活性的一个表现。作为函数,例如,它可以自动地适用于所有类别的对象类型。只要对象支持所预期的接口(a.k.a.protocol),那么函数就能处理。也就是说,如果对象传给函数的对象有预期的方法和表达式操作符,那么它们对于函数的逻辑来说就是有着即插即用的兼容性的。

即使是简单的times函数,任意两个支持*的对象都可以执行,无论它是哪种类型,也不管它是何时编写的。这个函数对于数字来说是有效的(执行乘法),两个字符串或者一个字符串和一个数字(执行重复),或者任意其他支持扩展接口的兼容对象——甚至是我们尚未编写过的基于类的对象。

除此之外,如果传递的对象不支持这种预期的接口,Python将会在*表达式运行时检测到错误,并自动抛出一个异常。因此编写代码错误进行检查是没有意义的。实际上,这样做会限制函数的功能,因为这会让函数限制在测试过的那些类型上才有效。

这也是Python和静态类型语言(如C++和Java)至关重要不同之处:在Python中,代码不应该关心特定的数据类型。如果不是这样,那么代码将只对编写时你所关心的那些类型有效,对以后的那些可能会编写的兼容对象类型并不支持,这样做会打乱代码的灵活性。大体上来说,我们在Python中为对象编写接口,而不是数据类型。

当然,这种多态的编程模型意味着必须测试代码去检测错误,而不是开始提供编译器用来为我们检测类型错误的类型声明。那么,以最初做些测试作为代价,我们马上减少了我们必须编写的代码,让代码可以灵活使用。正如你将学到的,这是一种实实在在的好处。

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

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

发布评论

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