核心类型复习和总结——Type 对象

未匹配的标注

事实上,在Python中即使type本身也是一种对象类型:对象的类型是一种名为type的对象类型(快速说三次!)。说正经的,对内置函数 type(X) 的调用返回对象X的类型对象。这个结果的实际应用是类型对象能被用来在Python的if语句中进行手动的类型比较。然而,因为第4章中介绍的原因,手动类型测试通常在Python中不是要做的正确的事情,因为它限制了代码的灵活性。

关于类型名称的说明:从2.2版本开始,每个核心类型都有新的内置名称,通过面向对象子类化来支持类型自定义:dict, list, str, tuple, int, float, complex, bytes, type, set 等等。在3.X中名称全部引用对象,且在2.X但非3.X中,file 也是一个类型名称且是open的同义词。对这些名称的调用其实是对象构造器调用,而不是简单的转换函数,然而对于基本用途,你可以将它们认为是简单函数。

另外,3.X的types标准库模块对不作为内置函数的那些类型提供了额外的类型名称(比如,函数的类型;在2.X但非3.X中,这个模块还包括了内置类型名称的同义词),且可以使用isinstance函数进行类型测试。比如,下面所有类型测试都是true:

type([1]) == type([]) # Compare to type of another list
type([1]) == list # Compare to list type name
isinstance([1], list) # Test if list or customization thereof
import types # types has names for other types
def f(): pass # `pass` is a fixed keyword, can't be changed. 
type(f) == types.FunctionType

因为在今天的Python中类型可以被子类继承,因此 isinstance技术通常被推荐。参见第32章了解Python 2.2 和之后版本中更多的关于子类化内置类型的知识。


注意

也是在第32章,将探索 type(X) 和 类型测试通常是如何应用于用户自定义的实例的。简言之,在3.X和2.X的新样式的类中,类实例的类型是创造该实例的类。而对在2.X中的经典类,所有的类实例是类型“instance”,且我们必须比较实例的__class__属性来有意义地比较它们的类型。因为我们还没有能力来处理类的主题,所以将把其剩下的内容推迟到第32章

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

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


暂无话题~