天天看点

python的面向对象系统中object和type之间的关系

Python中所有东西都是对象,比较特殊的是:object和type是python中的两个源对象,它们是互相依赖对方来定义,不能分割来说,就如同讨论“先有鸡还是现有蛋”,一样让人蛋疼。

先介绍有两个黑魔法在后面要用到:

obj.__bases__ 指这个对象的父类,就是说从谁继承来的。

obj.__class__ 指这个对象的类型,类的类型是type

Python的面向对象系统有两条线索。

1.继承关系也就是父类和子类的关系(the subclass-superclass relationship),以object为起点;

所有对象的父类是object,因此object是没有父类的。

>>> object.__bases__

()

type也是object的子类

>>> issubclass(type, object)

True

>>> type.__bases__

(<class 'object'>,)

2.类型和实例之间的关系( the type-instance relationship ),以type为起点。

type是自身的实例,或说type(对象object)的class(类型type)是type

>>> isinstance(type, type)

True

>>> type(type)

<class 'type'>

>>> type.__class__

<class 'type'>

就连object都是type的实例

>>> isinstance(object, type)

True

最后总结一下:

type是一个比较特殊的类,这里引出另一概念元类,普通类实例化出来一个对象,但是元类实例化出来的是一个类,

int、float、str、boolean、tuple、dict、set等内置的数据类型其实也就是内置的类都是type实例。

>>> isinstance(int, type)

True

>>> int.__class__

<class 'type'>

>>> 

object是所有对象(包括类对象)的父类,int、float、str、boolean、tuple、dict、set内置类都是object子类。

>>> int.__bases__

(<class 'object'>,)

>>> issubclass(int, object)

True