标签分类 技术文章:
当前位置:首页 > Python技术文章 > Python中实例化class的执行顺序示例详解

Python实例化class的执行顺序实例方法

  • 发布时间:
  • 作者:码农之家原创
  • 点击:161

这篇文章主要知识点是关于Python、实例化、class、执行顺序、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Python数据科学手册
  • 类型:Python大小:12.4 MB格式:PDF出版:人民邮电出版社作者:杰克·万托布拉斯
立即下载

更多Python相关的学习资源可以参阅 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 <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实现对字典分别按键、 Selenium定位元素操作实例详、 Python实现全排列打印及自、 等python文章进一步学习,感谢大家的阅读和支持。

上一篇:Scrapy框架使用的知识点总结

下一篇:python修改json文件的value实例方法

展开 +

收起 -

学习笔记
网友NO.871322

Python从list类型、range()序列简单认识类(class)【可迭代】

本文实例讲述了Python从list类型、range()序列简单认识类(class)。分享给大家供大家参考,具体如下: list类型 定义: items = [] 这就定义了一个名叫 items 的list。 往里填充数据: items.append(1)items.append(3)items.append(4)print(items) # [1, 3, 4] range序列 上面那个list,如果我们要 append 进去0~9的数字。最好是利用循环。 items = []for x in range(0,10): items.append(x)print(items) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 这里我们就学到了 range 这个类型, range(0,10) 包含0不包含10,可以简写为 range(10) 。 上面还可以这样写: items = [x for x in range(10)]print(items) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] range() 还有第三个参数: 步长 #从0到10,步长为2items = [x for x in range(0,10,2)]print(items) # [0, 2, 4, 6, 8] 每个元素都x3: items = [x*3 for x in range(0,10,2)]print(items) # [0, 6, 12, 18, 24] 每个元素都二次方 : items = [x**2 for x in range(0,10,2)]print(items) # [0, 4, 16, 36, 64] 什么叫 iterable可迭代 简单说就是可以进行 for 循环的。 字符串、list类型、字典类型、元组类型,包括自定义的类都是 可以迭代 。 Python里的类 #自定义类class Person: #类似构造函数 def __init__(self,name): self.name = name def show(self): print(self.name)#实例化类p = Person("jack")p.show() # jack 注意: self 可以换成任意如abc。 如何写静态方法? #自定义类class Person: @staticmethod def version():……

网友NO.236505

python函数之classmethod()

classmethod(function) 中文说明: classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法,使用方法如下: class C: @classmethod def f(cls, arg1, arg2, ...): ... 类方法既可以直接类调用(C.f()),也可以进行实例调用(C().f())。 版本 :python2.2中新增,在python2.4中增加新功能。python3中仍可用。 英文说明 : Return a class method for function. A class method receives the class as implicit first argument, just like an instance method receives the instance. To declare a class method, use this idiom: class C: @classmethod def f(cls, arg1, arg2, ...): ... The @classmethod form is a function decorator – see the description of function definitions in Function definitions for details. It can be called either on the class (such as C.f()) or on an instance (such as C().f()). The instance is ignored except for its class. If a class method is called for a derived class, the derived class object is passed as the implied first argument. Class methods are different than C++ or Java static methods. If you want those, see staticmethod() in this section. For more information on class methods, consult the documentation on the standard type hierarchy in The standard type hierarchy. New in version 2.2. Changed in version 2.4: Function decorator syntax added. 代码实例: class C:... @classmethod... def f(self):... print This is a class method... C.f()This is a class method c = C() c.f()T……

网友NO.898431

python3.6使用pickle序列化class的方法

如下所示: from library.connecter.database.mongo import Op_Mongoa = pickle.dumps(Op_Mongo)#序列化b = pickle.loads(a)#反序列化 以上这篇python3.6使用pickle序列化class的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。 ……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明