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 相关文章推荐
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
解读Django框架中的低层次缓存API
Jul 24 Python
Python操作Excel之xlsx文件
Mar 24 Python
Python3计算三角形的面积代码
Dec 18 Python
python opencv之分水岭算法示例
Feb 24 Python
使用Python实现租车计费系统的两种方法
Sep 29 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
Python中的延迟绑定原理详解
Oct 11 Python
在Python中等距取出一个数组其中n个数的实现方式
Nov 27 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 Python
分享7个 Python 实战项目练习
Mar 03 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
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
js制作提示框插件
2020/12/24 Javascript
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
python实现图片彩色转化为素描
2019/01/15 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
领导工作表现评语
2015/01/04 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
MYSQL常用函数介绍
2022/05/05 MySQL