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