核心类型复习和总结——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 章。
推荐文章: