其他核心类型——如何破坏代码的灵活性

未匹配的标注

后面会更多谈论所有的Python对象类型,但这里有一个类型值得特殊对待。type 对象(被内置函数type返回)是一个给出另一个对象的类型的对象;因为在3系列中类型已经完全和类(将在第六部分的“新样式”类的上下文中探索)融合,所以它的结果稍有不同。假设L仍是前一节中的列表:

# 在 Python 2系列中:
>>> type(L) # 类型: L的类型是列表类型对象
<type 'list'>
>>> type(type(L)) # 甚至类型也是对象
<type 'type'>
# 在 Python 3系列中:
>>> type(L) # 3系列: 类型是类,反之亦然
<class 'list'>
>>> type(type(L)) # 更多立即关于类的类型,请参见第32章
<class 'type'>

除了允许交互式地探索对象,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的关键思想。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~