Python中实例化class的执行顺序示例详解


Posted in Python onOctober 14, 2018

前言

本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧

Python里对类的实例化时有怎样的顺序

一般来说一个类里面有类变量和方法,比如我们定义一个名为A的类

class A():
 bar = "my lover love me"
 
 def __init__(self, name):
  print('A的class' ,self.__class__, name)

我们在这个类里面定义了一个类变量bar和一个构造方法__init__,那么我们实例化A()时都发生了什么呢!看官不要急,听我慢慢道来...

  • 首先,python 调用内置的type类,没有听错,就是我们平时用来测引用类型的那个type,然后type调用内置的元类mateClass,mateClass再调用__new__方法将类实例化,此时完成了第一步
  • 然后,这个实例将会初始化自己的类变量,就是把自己从头到尾扫视一遍,
  • 之后,进入构造方法,并初始化自己的实例变量。

注意:python中类变量和实例变量是不一样的,
类变量:不用实例化也可以访问。
实例变量:是动态创建的。必须实例化之后才可以访问,因为之前是不存在的。

比如下面这个例子:不实例化访问类变量

class A():
 a = 2
print(A.a)

输出:

>>>2

说了这么多,上代码。看看类继承时怎么运行的:

class A():
 def __init__(self, name):
  print('A的class' ,self.__class__, name)
  
class B(A):
 def __init__(self, name):
  self._name = name
  A.__init__(self, name)
  print('B的class', self.__class__, name)
 print('this is B class')
  
class C(B):
 def __init__(self, name):
  B.__init__(self, name)
  print('C的class')
  
if __name__ == '__main__':

c = C('lee')

输出如下:

this is B class
A class <class '__main__.C'> lee
B class <class '__main__.C'> lee
C class

来现身说法,解释一波

  • 首先对class C()进行实例化,从头到尾扫一遍,然后进入C()的构造,遇到了父类C()的构造方法B.__init__ 。
  • 进入class B(),从头到尾扫一遍,执行了print('this is B class')语句然后进入B()的构造,遇到了父类B()的构造方法A.__init__。
  • 进入class A(),从头到尾扫一遍,然后进入A()的构造方法A.__init__。然后A.__init__执行完毕并弹出栈,class A()执行完毕并弹出栈。
  • 回到class B(),从上次未执行完的地方print('B的class', self.__class__, name)继续执行。然后B.__init__执行完毕并弹出栈,class B()执行完毕并弹出栈。
  • 回到class C(),从上次未执行完的地方print('C的class')继续执行。然后C.__init__执行完毕并弹出栈,class C()执行完毕并弹出栈。程序运行完毕。
  • 由于是对class C()进行实例化,上面的self都是指class C()的实例而不是class A()的或者class B()的。因此self.__class__清一色的显示<class '__main__.C'>而不是<class '__main__.A'><class '__main__.B'>

随便补充一下使用type关键字动态创建类的知识点,敲黑板、、、我要用CET3.5的英语水平向大家翻译一部分官方文档对type的描述啦。

使用三个参数,返回一个新类型对象。这实际上是类语句的动态形式。名称字符串是类名,并成为__name__属性;基元元组列出基类并成为>__bases__属性;并且dict字典是包含类主体定义的命名空间,并被复制到标准字典以成为__dict__属性。

怎么样,是不是很拗口,是不是大写的懵*。so,上代码,以下两种写法输出一样的都是输出:重写name方法 1

class X():
 a = 1
 def __name__(self):
 return '重写name方法' 
x =X()
print(x.__name__(), x.a)
X = type('重写name方法', (object,), dict(a = 1))
x = X()
print(X.__name__, x.a)

type动态创建实例化时,第一个参数就相当于重写了类的__name__方法。X类但__name__属性却不叫X,呵,好反人类的写法
还好我们一般不是这么变态,通常我们会将这两个定义成相同的名字,如下:都叫X
X = type('X', (object,), dict(a = 1))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python循环语句之break与continue的用法
Oct 14 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
Python存取XML的常见方法实例分析
Mar 21 Python
Python无损音乐搜索引擎实现代码
Feb 02 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
Python终端输出彩色字符方法详解
Feb 11 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 Python
Django如何实现密码错误报错提醒
Sep 04 Python
python 开心网和豆瓣日记爬取的小爬虫
May 29 Python
详解Python requests模块
Jun 21 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 #Python
对python3中pathlib库的Path类的使用详解
Oct 14 #Python
python使用numpy读取、保存txt数据的实例
Oct 14 #Python
Python读取txt某几列绘图的方法
Oct 14 #Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
Oct 14 #Python
python得到qq句柄,并显示在前台的方法
Oct 14 #Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 #Python
You might like
Nginx下配置codeigniter框架方法
2015/04/07 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
javascript 日历提醒系统( 兼容所有浏览器 )
2009/04/07 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
文字垂直滚动之javascript代码
2015/07/29 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
python中 chr unichr ord函数的实例详解
2017/08/06 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
python生成随机红包的实例写法
2019/09/02 Python
使用Python函数进行模块化的实现
2019/11/15 Python
python在不同条件下的输入与输出
2020/02/13 Python
Python关于反射的实例代码分享
2020/02/20 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
优秀共产党员先进事迹
2014/01/27 职场文书
班级德育工作实施方案
2014/02/21 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书