首先class类里的内置方法,比如:__call__
,__str__
这些都是在一定条件下自动运行的。
下面我们来介绍几个内置方法
1、__str__
先讲讲他的作用,在print打印对象的时候会自动触发运行
例子1:
1 2 3 4 5 6 7 |
|
输出结果是
#<__main__.Student object at 0x0000023A1170C128>
#<__main__.Student object at 0x0000023A1170C128>
例子2:
我们可以在Student类自己定义一个__str__
方法来验证,执行print打印操作,原理#是执行了__str__
方法的
1 2 3 4 5 6 7 8 9 |
|
输入结果是:
xiaoming
<name:xiaoming age:18>
补充一下,对象的查找属性的顺序:对象自己的名称空间,对象对应类的名称空间,该类的基类的名称空间
2、__del__方法
作用是,会在删除对象之前自动触发该方法
我就直接上代码吧
1 2 3 4 5 6 7 8 9 |
|
他的执行结果是
主
xiaoming 已经被删除
zhangsan 已经被删除
讲讲为什么是这个输出结果:这个python解释器的垃圾回收机制吧,一个程序运行完毕,python会回收该程序在内存中产生的数据,当执行到print(‘主’),后面没有代码执行了,就会删掉stu1,stu2这两个对象,删除这两个对象之前呢,会执行__del__
方法,所以会出现上面的结果。
3、__call__
在调用该对象时,也就是实例化的时候,会自动运行其类和类的基类中的__call__
方法,如果没有的,那么该对象是不可调用的对象
1 2 3 |
|
分析一下:首先一切皆对象,Student就是一个对象,Student他是通过元类(type)实例化得来的,所以说调用Student(),就是去找type元类中找__call__
方法去执行,很明显type类中有__call__
方法,运行上面那段代码,不会出错。
下面举个例子来验证下上面的结论
1 2 3 4 5 6 7 8 9 10 11 |
|
结论:通过这两个例子可以得到,只要该对象的类中有__call__
方法,那该对象就可以调用,也就是实例化。
该对象实例化,就是运行其类中的__call__
方法
验证下:该对象实例化,就是运行其类中的__call__
方法
1 2 3 4 5 6 7 |
|
#输出结果是:我被xiaoming调用了
如何通过元类来控制类的调用
通过在自定义元类里的__call__
方法,来实现对类的调用控制
1、首先类的调用原理就是运行元类里的__call__
方法
2、通过__call__
方法来实现对对象的初始化操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
这就是类的实例化的整个过程,不过这是我们通过自定义元类来控制类的调用,也就是再__call__
多些代码而已
在默认元类type里,肯定有__call__
方法,该方法下面就是产生个空对象,再执行__init__
方法
先讲到这三个方法,其他那些__dict__,class,__name__这些就不说了
到此这篇关于Python面向对象的内置方法梳理讲解的文章就介绍到这了