龙岗 网站建设深圳信科,山西网络营销,企业互联网推广,网络营销经典案例前言
本文主要介绍了关于Python实例化class的执行顺序的相关内容#xff0c;下面话不多说了#xff0c;来一起看看详细的介绍吧
Python里对类的实例化时有怎样的顺序
一般来说一个类里面有类变量和方法#xff0c;比如我们定义一个名为A的类
class A():
bar my lover…前言
本文主要介绍了关于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调用内置的元类mateClassmateClass再调用__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