其他核心类型——如何破坏代码的灵活性 | 第二部分 类型与操作 —— 第 4 章: 介绍 python 对象类型 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-380玩彩网官网入口
后面会更多谈论所有的python对象类型,但这里有一个类型值得特殊对待。type 对象(被内置函数type
返回)是一个给出另一个对象的类型的对象;因为在3系列中类型已经完全和类(将在第六部分的“新样式”类的上下文中探索)融合,所以它的结果稍有不同。假设l
仍是前一节中的列表:
# 在 python 2系列中:
>>> type(l) # 类型: l的类型是列表类型对象
>>> type(type(l)) # 甚至类型也是对象
# 在 python 3系列中:
>>> type(l) # 3系列: 类型是类,反之亦然
>>> type(type(l)) # 更多立即关于类的类型,请参见第32章
除了允许交互式地探索对象,type
对象在其最实用的应用程序中还允许代码检查它处理的对象类型。事实上,在python脚本中至少有三种这么做的方式:
>>> if type(l) == type([]): # 类型测试(如果必须)...
print('yes')
yes
>>> if type(l) == list: # 使用类型名称
print('yes')
yes
>>> if isinstance(l, list): # 面向对象的测试
print('yes')
yes
现在已展示了完成类型测试的所有方法,然而,必须告诉你:在python编程中,这么做几乎总是错的(而且通常是一个前c程序员刚开始使用python的标志)。这原因只有在本书后面,开始编写更大的代码单元如函数时,才会变得完全清楚,但它(可能)是核心的python概念。检查代码中的特定类型实际上破坏了代码的灵活性——因为将它限制到了一种类型上。没有那些测试,代码可能可以在所有类型上工作。
这和之前提到的多态性概念有关,且它源于python缺乏类型声明。将看到:在python中,是对对象接口(支持的操作)而非对类型进行编码。也就是说,关心的是对象做什么,而不是它是什么。不关心特定的类型意味着代码对许多类型都自动可用——有兼容接口的对象不管具体是什么类型都可以工作。虽然支持类型检查(且甚至在一些罕见案例中是必须的),但将发现它通常不是“python式的”思考方式。事实上,将会发现多态性才可能是用好python的关键思想。