python实例化类执行顺序_Python中实例化class的执行顺序示例详解

本文详细解析了Python中实例化类时的执行顺序,包括类变量的初始化、类方法的调用,以及实例变量的动态创建过程。通过实例演示了类继承时构造方法的调用顺序,帮助理解Python类的实例化细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

您的位置:首页 > 站长学院 > 网络技术 正文内容 Python中实例化class的执行顺序示例详解

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

更新时间:2018-10-15 00:00:23 作者:佚名

text-message.png 我要评论(0)

前言

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

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

前言

本文主要介绍了关于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__方法将类实例化,此时完成了第一步

然后,这个实例将会初始化自己的类变量,就是把自己从头到尾扫视一遍,

之后,进入构造方法,并初始化自己的实例变量。

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

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

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

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)

type动态创建实例化时,第一个参数就相当于重写了类的__name__方法。X类但__name__属性却不叫X,呵,好反人类的写法

还好我们一般不是这么变态,通常我们会将这两个定义成相同的名字,如下:都叫X

X = type('X', (object,), dict(a = 1))

总结

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

您可能感兴趣的文章:python基础教程之类class定义使用方法python类:class创建、数据方法属性及访问控制详解Python中Class类用法实例分析python实现class对象转换成json/字典的方法深入理解Python中的元类(metaclass)Python 中 Meta Classes详解

一般来说 2018-10-15

82cf9e98623aad2e97e16d6d2e63fed7.jpg

Spring boot连接MySQL 8.0可能出现的问题 前言

在学习任何一个后端技术,如果不让数据库参与进来,那只能说在学习过程中都不算完整的。

以前用的是5.7版本的MySQL,在学习实践Springboot的时候顺带升级 2018-10-15

82cf9e98623aad2e97e16d6d2e63fed7.jpg

浅析Python 3 字符串中的 STR 和 Bytes 有什么区别 Python2的字符串有两种:str和Unicode,Python3的字符串也有两种:str和Bytes。Python2的str相当于Python3的Bytes,而Unicode相当于Python3的Bytes。

Python2 2018-10-15

82cf9e98623aad2e97e16d6d2e63fed7.jpg

Python 实现某个功能每隔一段时间被执行一次的功能方法 本人在做项目的时候遇到一个问题:

某个函数需要在每个小时的 3 分钟时候被执行一次,我希望我 15:45 启动程序,过了18 分钟在 16:03 这个函数被执行一次, 2018-10-15

82cf9e98623aad2e97e16d6d2e63fed7.jpg

定义vim配置文件vimrc用于c/c++编程 vim作为Linux下广受赞誉的代码编辑器,其独特的纯命令行操作模式可以很大程度上方便编程工作,通过自定义vim配置文件可以实现对vim功能的个性化设置。

vi 2018-10-15

82cf9e98623aad2e97e16d6d2e63fed7.jpg

nginx从编译安装到配置文件说明中文详细介绍 本文详细介绍了Nginx从编译安装到配置文件说明,每一步都给出了详细介绍,可以作为安装Nginx的指导手册了

好了,费话不多说直接进入主题

1. 安装nginx

bufio模块是golang标准库中的模块之一,主要是实现了一个读写的缓存,用于对数据的读取或者写入操作。该模块在多个涉及io的标准库中被使用,比如http 2018-10-15

82cf9e98623aad2e97e16d6d2e63fed7.jpg

python 异或加密字符串的实例 做个简单习题:输入明文给定秘钥,密文还原,按位异或处理。

Thread(target=fn, args=args, kw 2018-10-14

82cf9e98623aad2e97e16d6d2e63fed7.jpg

java??ConcurrentHashMap??????????????????? ???

ConcurrentHashMap??Java 5??????????????????????????HashMap????

?????????ConcurrentHashmap(1.8)?????????????????????????????????get???????????ge 2018-10-14

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值