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原始字符串(raw strings)用法实例
Oct 13 Python
django文档学习之applications使用详解
Jan 29 Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 Python
浅析python继承与多重继承
Sep 13 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
Sep 05 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
Python中random模块常用方法的使用教程
Oct 04 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 命令行参数详解及应用
2011/05/18 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
Python中字符编码简介、方法及使用建议
2015/01/08 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
Django封装交互接口代码
2020/07/12 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
计算机专业毕业生的自我评价
2013/11/18 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python