>>> from env_helper import info; info()
页面更新时间: 2024-01-17 16:01:15
运行环境:
Linux发行版本: Debian GNU/Linux 12 (bookworm)
操作系统内核: Linux-6.1.0-17-amd64-x86_64-with-glibc2.36
Python版本: 3.11.2
6.1. 理解 built-in objects¶
我们知道Python中一切皆对象:字符是对象,列表是对象,内建类型(built-in type)也 是对象; 用户定义的类型是对象,object是对象,type也是对象。 自Python2.2之后,为了弥 补内建类型和古典类(classic classes)之间的鸿沟引入了新式类(new-style classes)。 在新式类 中,object是所有内建类型的基类,用户所定义的类可以继承自object也可继承自内建类型。
那么内建类型、object、type以及用户所定义的类之间到底有什么关系呢?它们之间本 质上有什么不同吗?我们来看一个简单的例子:
- class A:
pass
- class B(object):
pass
- class C(type):
pass
- class D(diet):
pass
现在有类A、B、C、D的实例分别对应为a、b、c、d,我们来看一组求值的结 果,如表6-1所示。

从表6-1中我们可以得出如下结论: *
object[l]和古典类[3]没有基类,type[2]的基类为object。 *
新式类([4],[5],[6])中type()的值和__class__
的值是一样的,但古典类[3]中实例的
type为instance,其type()的值和__class__
的值不一样。 *
继承自内建类型的用户类的实例[6]也是object的实例,object[l]是type的实例,
type实际是个元类(metaclass)。 *
object和内建类型以及所有基于type构建的用户类[5]都是type的实例。 *
在古典类中,所有用户定义的类的类型都为instance。
综上,不同类型的对象之间的关系如图6-1所示。

我们知道古典类和新式类的一个区别是:新式类继承自object类或者内建类型。那么是 不是可以这么理解:如果一个类定义的时候继承自object或者内建类型,那么它就是一个新 式类,否则则是古典类?我们来看一个例子:
>>> class TestNewClass:
>>> __metaclass__ = type
>>> type (TestNewClass)
type
>>> TestNewClass.__bases__
(object,)
>>> a= TestNewClass ()
>>> type (a)
__main__.TestNewClass
>>> a.__class__
__main__.TestNewClass
从上述例子我们可以看出,TestNewClass在定义的时候并没有继承任何类,但测试的结
果表明其父类为object,它还是属于新式类。这其中的原因在于TestNewClass中设置了__metaClass__
属性(关于元类的更多介绍可以参看后面的章节)。所以我们并不能简单地从定
义的形式上来判断一个类是新式类还是古典类,而应当通过元类的类型来确定类的类型:古
典类的元类为types.ClassType,新式类的元类为type类。
新式类相对于古典类来说有很多优势:能够基于内建类型构建新的用户类型,支持
property和描述符特性等3作为新式类的祖先.Object类中还定义了一些特殊方法,如:__new__()
,
__init__()
,__delattr__()
,__getattribute__()
,
__setattr__()
, __hash__()
,
__repr__()
,__str__()
等。object的子类可以对这些方法进行覆盖以满足自身的特殊需求,建议62中会对
其中某些内容详细阐述,感兴趣的读者可以阅读。
注:在Python中一切皆对象,type也是对象3