Object与Type
- 1、Object与Type概述
- 2、Object与Type的关系
1、Object与Type概述
对象(Object)和类型(Type)是Python中两个最最基本的概念,它们是构筑Python语言大厦的基石
所有的数据类型,值,变量,函数,类,实例等一切可操作的基本单元在Python中都是对象(Object),每个对象都有三个基本属性:ID、类型和值
a = 1
print(id(a), type(a), a) # 1958094307568 <class 'int'> 1
id()内建方法获取对象的唯一编号,它是一个整数,通常就是对象的内存地址。type()内置方法获取对象的类型(Type)
一个对象可能有一个或多个基类(Bases),当一个对象表示数据类型时,比如int对象,它就具有了__bases__
属性
print(int.__bases__) # (<class 'object'>,)
type和bases定义了该对象与其他对象间的关系,实际上对象内的type和bases均指向其他对象,是对其他对象的地址引用
一个对象必有Type属性,同样Type是不能脱离开对象存在的
type()内置方法获取对象的类型。我们也可以使用对象.__class__
来获取对象的类型,它们是等价的
print(type(a)) # <class 'int'>
print(a.__class__) # <class 'int'>
Class和Type均是指类型(Type),Class通常用于普通用户使用class自定义的类型。Type通常指Python的解释器CPython内置的类型
CPython提供内置方法type()而没有定义class(),因为它们本质是一样的,只是不同的语境产生的不同说法
2、Object与Type的关系
Python中的对象之间存在两种关系:
- 1)父子关系或继承关系(Subclass-Superclass或Object-Oriented),如“猫”类继承自“哺乳动物”类,我们说猫是一种哺乳动物。对象的
__bases__
属性记录这种关系,可以使用issubclass()判断 - 2)类型实例关系(Type-Instance),如“米老鼠是一只老鼠”,这里的米老鼠不再是抽象的类型,而是实实在在的一只老鼠。对象的
__class__
属性记录这种关系,可以使用isinstance()判断
Python把对象分为两类:类型对象(Type)和非类型对象(Non-type)
- 1)int、type、list等均是类型对象,可以被继承,也可以被实例化
- 2)1、[1]等均是非类型对象,它们不可再被继承和实例化,对象间可以根据所属类型进行各类操作,比如算数运算
object和type是CPython解释器内建对象,它们的地位非常特殊,是Python语言的顶层元素:
- 1)object是所有其他对象的基类,object自身没有基类,它的数据类型被定义为type
- 2)type继承了object,所有类型对象都是它的实例,包括它自身。判断一个对象是否为类型对象,就看它是否是type的实例
其中,实线表示继承关系,虚线表示实例关系
isinstance()内置方法本质是在判断对象的数据类型,它会向基类回溯,直至回溯到object
print(isinstance(object, type)) # True
print(isinstance(type, object)) # True
print(isinstance(type, type)) # True
print(isinstance(object, object)) # True
print(object.__class__) # <class 'type'>
print(type.__class__) # <class 'type'>
Python中还定义了一些常量,比如True、False。其中有两个常量None和NotImplemented比较特殊,通过type()可以获取它们的类型为NoneType和NotImplementedType,这两个类型不对外开放,即普通用户无法继承它们,它们只存在于CPython解释器中
print(type(None)) # <class 'NoneType'>
print(type(NotImplemented)) # <class 'NotImplementedType'>