Python中实例化class的执行顺序示例详解

前言

本文主要介绍了关于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 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

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))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

python类中方法的执行顺序-Python实例化class的执行顺序实例方法相关推荐

  1. python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  2. python类中方法的执行顺序-Python中实例化class的执行顺序示例详解

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

  3. python 类中方法总结 --- 实例方法、类方法、静态方法

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例 ...

  4. python类中方法调用自己类的方法_python 类中方法总结 --- 实例方法、类方法、静态方法...

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...

  5. python类中方法调用自己类的方法_python怎么调用类方法

    python中的类用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 要想调用类中的方法,首先要定义一个类,python中定义类使用class关键字 ...

  6. python 类中方法的动态特性

    2019独角兽企业重金招聘Python工程师标准>>> 方法添加 class  Fruit(object): pass def add(self): print "grow ...

  7. python类中方法的执行顺序-python – 新式类中的方法解析顺序(MRO)?

    在Python in a Nutshell(第2版)一书中有一个使用的例子 旧样式类,用于演示如何以经典分辨率顺序解析方法 它与新订单有何不同. 我通过重写新样式的示例尝试了相同的示例,但结果与使用旧 ...

  8. python类中方法的执行顺序-python 函数或者类 代码的执行顺序

    修改了一下问题,大家直接先看例 3 对于简单的控制语句来说, x = 1 if x > 0: print('true') else: print('false') 我们都知道当判定 x > ...

  9. python预定义_【Python】python类中方法的预定义

    知乎问题: 像这个图片里面显示的,self.prediction首先声明了下然后下面给出了定义,然后optimize又调用这个函数但是没有用self.prediction()这样的方式而是像用变量一样 ...

最新文章

  1. 第一个spring boot应用
  2. magic系统将来能升鸿蒙,荣耀30和V30将首批搭载Magic UI 4.0 后续可升级鸿蒙系统
  3. MySoft.Data从入门到精通系列(五)【数据更新】
  4. Matlab中更改fig文件中线宽
  5. 信息安全系统第十三周学习总结 20135218 姬梦馨
  6. 工业以太网交换机的软件故障
  7. Modbus协议栈应用实例之一:Modbus RTU主站应用
  8. 简述php和web交互过程,PHP与Web页面交互操作实例分析
  9. ansys里面自带chemkin_ANSYS CHEMKINPRO复杂化学反应快速仿真
  10. NLP情感分析笔记(六):Transformer情感分析
  11. 自动化测试基础篇--Selenium发送测试报告邮件
  12. 皕杰报表使用技巧:竖排文字如何输入
  13. ios GCD多线程
  14. python 爬虫 微博 github_GitHub - berluo/weiboSpider-1: 新浪微博爬虫,用python爬取新浪微博数据...
  15. PostgreSQL 修改数据库用户的密码
  16. <笠翁对韵>全文及译文(上卷)
  17. 爱心的数学函数方程_什么函数图像能构成爱心?
  18. 计算机国内期刊sci,国内计算机类期刊 SCI收录:
  19. Navicat Premium基本使用
  20. oracle嵌套case when,case when 中是否可以在嵌套一个case when ?

热门文章

  1. Jenkins 无法捕获构建脚本错误问题
  2. Leetcode:Intersection of Two Linked Lists
  3. 视频编辑SDK---我们只提供API,任你自由设计炫酷的功能
  4. C++:sprintf()的用法(转)
  5. Redhat下的软件安装 RPM包管理工具介绍
  6. [flex]报错,Resource Path Location Type 源路径条目“… Unknown Flex 问题
  7. python小项目实例流程-推荐三个最适合零基础小白练手的python项目,分享给你!...
  8. 编程软件python下载怎么读-使用最方便的计算机编程软件,Python下载使用完美教程...
  9. python从入门到入土表情包-Python开发个人专属表情包网站,表情在手,天下我有...
  10. python web-Java web 和 Python web??