声明:以下仅为个人学习Python过程中总结的比较自洽的理解,事实上Python面向对象模型可能没那么简单。经查阅,Python在以前的版本还有不继承自object的类,叫做经典类。
用dir(object)可以查看object所有属性和方法的名称。
个人的理解是,object是Python语言面向对象模型的重要且必要组成部分。在Python中,每一个名称(变量名、函数名、类名)都指向一个对象(对象往往都是占据内存空间的实体),每个对象的内部都规定了该对象从属的类,而每个类都有父类,一直追溯下去,必然得到所有类的基类——object类,同时这个类也是对象,你可以通过id(object)获得object对象的地址,通过sys.getsizeof(object)获得object对象占用内存大小。
object类是最特殊的类,它的父类就是自身。object类存在的意义在于,它使所有Python对象本质上都属于object类,都继承了object类的属性和方法,哪怕是其它语言中还不属于对象的原子类型:整型、浮点或者布尔类型。这使得Python写起来很容易,例如,在静态语言里,函数的传入参数必须符合类型规定,是double就不能是int,否则编译就无法通过。但是在Python中,不管你传入什么参数到函数中,都是object类型或其子类的对象,而类型不符合的异常在使用者不主动检查类型时是等到运行过程中属性或方法引用失败才抛出的。所以说,Python是强类型,而不是没有类型,只不过所有变量类型都继承自object,这套类型系统是非常严密的。
然而,Python这种面向对象模型有静态语言不具有的弊端,就是Python必须给每个变量都在内存中存储面向对象相关的信息。例如,一个整数在C语言中占4个字节,但是在Python中:
另外,对于同样的表达式a+b,静态语言直接根据类型编译成机器码,而Python则是将这个表达式看成a.__add__(b),过程中需要判断a对象是否有__add__方法,b对象是否符合条件,性能上相比静态语言落后了很多。