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中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
Python socket 套接字实现通信详解
Aug 27 Python
Django模板语言 Tags使用详解
Sep 09 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
利用python绘制数据曲线图的实现
Apr 09 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
php不用正则采集速度探究总结
2008/03/24 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
Ionic快速安装教程
2016/06/03 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
2019/03/06 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
Python中decorator使用实例
2015/04/14 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
flask-restful使用总结
2018/12/04 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
校本教研工作制度
2014/01/22 职场文书
幼儿教师考核制度
2014/01/25 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
同学聚会主持词
2014/03/18 职场文书
婚假请假条怎么写
2014/04/10 职场文书
劳模先进事迹材料
2014/12/24 职场文书