python实例化是什么意思_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))

总结

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

本文标题: Python中实例化class的执行顺序示例详解

本文地址: http://www.cppcns.com/jiaoben/python/241665.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS集成模式和经典模式 系统部署的不同

http://blog.csdn.net/byondocean/article/details/7074772转载于:https://www.cnblogs.com/mmnyjq/p/3298193.html

贪心算法

贪心算法 一、定义 什么是贪心算法呢?所谓贪心算法是指,在对问题求解时,总是做出在当前看来最好的选择。也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题都能产生整体…

spring 基于java的配置

2019独角兽企业重金招聘Python工程师标准>>> 7.10 Classpath scanning and managed componets 文档地址: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-classpath-scanning 本章中大部分例子是用xml来指定配置元数据,以…

如何提升个人专业能力

1.写文章,多发表个人见解,增加个人思考机会; 2.大量看书,自学,但一定要选好书;3.多和圈里高手交流,听君一席话,胜读十年书,遇到不懂的多请教;4.建立个人文件管…

WPF 实现3D翻转倒计时控件~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇倒计时控件01—代码如下一、创建 NumberCardControl.xaml代码如下。<UserControl x:Cl…

python逐行读取excel_python对execl 处理操作代码

1. 读取execl 1.前提需要安装xlrd模块&#xff0c;这个在网上可以找安装教程&#xff0c;这里就不写了 2. 打开表格 3. 读取表格的sheet 4. 按行读取数据或者列读取数据或者单元格读取数据 实际操作&#xff1a; import xlrd import xlwt from xlutils.copy import copy def in…

Android之Android studio基本调试和快捷键

第一种调试方法: 如果APP是单进程,直接debug运行,如下图 第二种调试方法: 第二种就是调试当前已经处于运行状态下的App,这也是我们用的更多的一种调试手段,即 Attach debugger to Android process 。点击运行按钮右侧第三个按钮,弹出 Choose Process 窗口,选择对应的进…

Windows 2008 R2安装DHCP服务器问题及解决方法

错误一&#xff1a;0x80074E6F 指定的服务器已在目录服务中造成此错误的原因是DHCP服务器没有正常卸载&#xff0c;第二次安装就会报如下图错误解决方法1.卸载DHCP服务器2.重启服务器3.打开adsiedit.msc4.如下图展开到 CNNetServices5.删除CNYour ServerName6.重新安装DHCP服务…

免费动态域名解析

DDNS 顾名思义就是动态域名解析&#xff0c;让域名绑定在动态 IP 上&#xff0c;比如拨号上网的 ADSL 用户。国内的 DDNS 服务有花生壳和 3322.org 这种提供商&#xff0c;我一直在用花生壳的免费 DDNS&#xff0c;可是近期情况非常糟糕&#xff0c;我到北京以来&#xff0c;就…

2021 年 CNCF 和开源速度的年终报告

深入了解开发速度最快的项目&#xff0c;可以很好地表明哪些领域正在起飞&#xff0c;哪些平台可能在未来几个月和几年内取得成功。如何评估一个项目的活跃度&#xff0c;通常从这几个方面, commits, contributions, issues 和 pull requests&#xff0c;而使用气泡图是一种很巧…

清华姚班毕业生不配自信?张昆玮在豆瓣征女友,却被网友群嘲......

全世界只有3.14 % 的人关注了爆炸吧知识不要看脸好好说话没想到&#xff0c;清华也有被瞧不起的一天。上周&#xff0c;山西某网友在D瓣上发布了一则征友贴&#xff1a;总结下来&#xff0c;就是一句话&#xff1a;俺&#xff0c;一介俗人&#xff0c;二本教师&#xff0c;兼职…

转: javascript技术栈

http://www.infoq.com/cn/articles/state-of-javascript-2016

python自带的函数有哪些_为什么说 Python 内置函数并不是万能的?

在Python猫的上一篇文章中&#xff0c;我们对比了两种创建列表的方法&#xff0c;即字面量用法 [] 与内置类型用法 list()&#xff0c;进而分析出它们在运行速度上的差异。在分析为什么 list() 会更慢的时候&#xff0c;文中说到它需要经过名称查找与函数调用两个步骤&#xff…

抽象类与接口比较

为什么80%的码农都做不了架构师&#xff1f;>>> 老生重谈&#xff0c;每次谈却有不同的收获。抽象类与接口联系 1、是什么 抽象类&#xff1a; public abstract class Door{public int height 250;public int width 150;void open(){System.out.print(&qu…

数据库优化分层思想

可以分别从SQL语句层面、SQL配置层面、SQL架构层面和业务层面来优化。 SQL 语句层面 1. 调优策略 *号的处理&#xff08;只是提取必要字段&#xff0c;减少流量&#xff09;大SQL&#xff08;拆分、逐步缩小结果集&#xff09;合理的索引&#xff08;where字句后面的条件&#…

Prism源代码解析(IRegionManager)

概要本文主要介绍Prism的IRegionManager, 主要分析源代码的执行流程, 来介绍内部实现的几个核心接口调用过程。通过本文, 你可以熟练的掌握Prism当中以下接口的作用以及使用方法, 如下所示:IRgionManagerINavigationAwareINavigateAsyncIRegionNavigationServiceIConfirmNaviga…

微博与Redis系统技术文章记录

Redis 持久化&#xff0c;有两种&#xff1a; rdb 和 aof&#xff0c; rdb是记录一段时间内的操作&#xff0c;一盘的配置是一段时间内操作超过多少次就持久化。 aof可以实现每次操作都持久化。 这里我们使用aof。 配置方式&#xff0c;打开redis的配置文件。找到appendonly。…

求字符串里面数字之和

无意看到别人面试问了很简单的问题,求字符串里面数字之和,所以自己来实现下。 例子: 比如字符串:aaaa13sseui9ddu78ff4sss 里面的字符串数字是13、9、78、4 得到的和为104 代码如下: package com.sangfor.tree;public class SumByString {public static int sumByStri…