Python类的实现原理
1、所有类的父类是Object
所有类的基类(父类)是object。在创建类的时候,可通过dir(classname)查看继承的方法。在Python中之所以没有其他语言中的类那么麻烦,绝对要归功于object函数。
因为是python3默认每个类在创建时都会继承object,所以我们利用python2来看一下
class student ------> ['__doc__', '__module__', 'name']
class teacher(object) ------>
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']
以上student就是一个经典类,下面这个继承了object的类我们把它叫做新式类。其中过多的函数我们可以不去探究,如果有兴趣可以查看python源码解析。我们需要知道的是,经典类和新式类在用法上最大的区别就是(经典类–深度优先)、(新式类–广度优先)。什么意思呢?很简单的例子:当一个类A继承了两个父类B、C时,且类B、类C分别也继承了一个父类D、E,我们通过调用类A调用一个函数,已知函数存在于类E中。那么此时经典类使用深度优先则会先找完B类、D类,再找C、E类,而新式类则是广度优先先找B、C类,再找D、E类。从思维上讲,新式类会更好一些。
2、类的创建方法依赖于type类
在我们定义一个类的时候如 class Student:。那么此时其实是调用了type类。
type函数:我们通常知道type类是用于查看类型,对没错,我们查看student类的类型,如下图:
class student:
pass
print(type(student))
>> <class 'type'>
由上而见,其实类的创建是通过type类进行的。既然如此,我们用type类来创建一个类:
stu=type('student',(),{'data': 1})
print(type(stu))
print(stu().data)
>> <class 'type'>
>> 1
显而易见、效果是相同的。type类就是所有类的元类。
Python 真正执行的是下面这段代码:
class = type(classname, superclasses, attributedict)
这里等号右边的type(classname, superclasses, attributedict)就是 type 的__call__运算符重载,它会进
一步调用:
type.__new__(typeclass, classname, superclasses, attributedict)
type.__init__(class, classname, superclasses, attributedict)
所以也就证实了:类的创建方法依赖于type类