前言

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

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

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

1

2

3

4

5

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中类变量和实例变量是不一样的,

类变量:不用实例化也可以访问。

实例变量:是动态创建的。必须实例化之后才可以访问,因为之前是不存在的。

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

1

2

3

class A():

a= 2

print(A.a)

输出:

>>>2

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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 lee

B class 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__清一色的显示而不是或 。

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

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

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

1

2

3

4

5

6

class X():

a= 1

def __name__(self):

return '重写name方法'

x=X()

print(x.__name__(), x.a)

1

2

3

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中实例化class的执行顺序示例详解相关推荐

  1. python实例化是什么意思_Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  2. python类的方法中定义函数

    代码: class A():def run(self):def p():print('hello')p()a = A() a.run() 输出: hello 注意类中方法和普通函数的区别,python ...

  3. python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异

    每门编程语言在发布更新之后,主要版本之间都会发生很大的变化. 在本文中,Vinodh Kumar 通过示例解释了 Python 2 和 Python 3 之间的一些重大差异,以帮助说明语言的变化. 本 ...

  4. python中import re_Python3中正则模块re.compile、re.match及re.search函数用法详解

    本文实例讲述了Python3中正则模块re.compile.re.match及re.search函数用法.分享给大家供大家参考,具体如下: re模块 re.compile.re.match. re.s ...

  5. python bisect_Python中bisect的用法及示例详解

    bisect是python内置模块,用于有序序列的插入和查找. 查找: bisect(array, item) 插入: insort(array,item) 查找 import bisect a = ...

  6. [Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. python 匿名函数示例_扣丁学堂Python3开发之匿名函数用法示例详解

    扣丁学堂Python3开发之匿名函数用法示例详解 2018-07-26 14:01:11 1324浏览 今天扣丁学堂Python培训给大家分享关于Python3匿名函数用法,结合实例形式分析了Pyth ...

  8. Python爬虫之爬取淘女郎照片示例详解

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...

  9. go语言字符串换行_Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号(" ...

  10. python的用途实例-python assert的用处示例详解

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

最新文章

  1. 如何在Storyboard中使用Scroll view
  2. 一个简单的记事本程序
  3. 做事情一定要从小事情着手
  4. 推荐几个实用的Python“小伎俩”
  5. 51nod 1222 最小公倍数计数【莫比乌斯反演】
  6. android进程 系统启动过程 android boot sequence
  7. extern “C”
  8. docker中启动关闭删除所有的容器命令
  9. 四月份面试题汇总(一)
  10. java监控文件内容变化_Java使用WatchService监控文件内容变化的示例
  11. docker(4):coreos+docker+rancher真厉害
  12. PBOC规范研究之四、文件结构及访问(转)
  13. 单区域——OSPF 讲解+配置命令(为了做双机热备实验)
  14. 马尔可夫链、隐马尔科夫模型、贝叶斯网络、因子图
  15. 学计算机的要起一个群名,如何起一个代表青春的群名字
  16. 张锋因何错过诺贝尔化学奖?
  17. Unraid USB启动盘怎么更换和重新获取注册码密钥?
  18. 《公安机关办理刑事案件电子数据取证规则》
  19. 仿京东手机端地址选择四级地址选择
  20. 专访闪能申论凌青:学会申论应试五大力,轻松碾压对手

热门文章

  1. 从 Eclipse 迁移至 Android Studio
  2. Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
  3. 并发和在线用户数的思考
  4. 极其好用好学的规则引擎 - A2D规则引擎
  5. KRSReader酷狗音乐歌词写真图片提取工具(提取KRS文件中的图片)
  6. NYOJ 453 小珂的烦恼 模拟
  7. 电影网网站优化-SEO篇
  8. 关于python语言、下列说法不正确的是-下列语句中,___________是不正确的Python语句...
  9. python使用教程pandas-python使用pandas处理excel的方法
  10. python画折线图详解-Python数据可视化(一) 绘制折线图和散点图