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 代码优化详解
Oct 27 Python
python实现端口转发器的方法
Mar 13 Python
python使用pymysql实现操作mysql
Sep 13 Python
Python实现学生成绩管理系统
Apr 05 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
sklearn+python:线性回归案例
Feb 24 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
Django 5种类型Session使用方法解析
Apr 29 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
Jun 01 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
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
处理单名多值表单的详解
2013/06/08 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
预备党员政审材料
2014/02/04 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
nginx容器方式反向代理实战
2022/04/18 Servers