Python实例变量,python类变量与实例变量的区别

  Python实例变量,python类变量与实例变量的区别

  类变量:一个类的所有实例可以共享的变量实例变量:同一个类对象可以创建多个实例类对象,类定义中带有self标志的变量就是实例变量类实例对象:类的实例是通过调用类对象创建的。例如par=Parent(),par是class Parent的类实例对象。

  1.继承中python变量的值如下:1,如果该变量在该类中有定义,则使用该值。2,如果没有,将搜索父类,多继承时采用C3方法,一般不存在交叉的类都是从左到右顺序搜索。搜索过程中如果前面父类的值被重新赋值,则类变量值将改变成该值

  C3方法的细节见http://www.nanerbang.com/article/40/。

  如果你不想了解,就打电话类名.mro()打印出来,看一下搜索顺序。

  二。继承中python实例变量的值如下:1,搜索方式和类变量一样,先找自己,再找父类,多继承也是使用C3,一般不存在交叉的类时按照从左到右顺序搜索2,实例变量只会继承最开始的初始值,即使父类中的实例变量值被重新赋值,子类的值也不会跟着改变,仍会选择最开始的初始值。

  三。举例证明运行环境:python3.6例一,继承关系Children1继承自Parent,Children2也继承自Parent。

  类Parent(object): x=1 #类变量def __init__(self): self.y=1 #实例变量class children 1(Parent):passclasschildren 2(Parent):passpar=Parent()#具体类实例对象child1=Children1() #具体类实例对象child2=Children2() #具体类实例对象print ( -。Children1.x=,Children1.x,,Children2.x=,Children2.x)print(par.y=,par.y,,child1.y=,child1.y,,child2.y=,child 2 . y)print(-)Children1.x=2 child 1 . y=2 print( Parent.x=,Parent . x,,Children1.x=,children 1 . x,,Children2.x=,Children2.x)print(par .

  - Parent.x=1,Children1.x=1,Children2.x=1par.y=1,Children1.x=1,children 2 . y=1-parent . x=1,Children1.x=2,Children2.x=1par.y=1,children 1 . y=2,children 2 . y=1-parent . x=3,Children1.x=2,Children2.x=3par.y=3,children 1 . y=2,2。孩子。Y=1 -父母。X=3,孩子1。X=2,孩子2。X=4par

  1,对于类变量X,起初,Children1和Children2没有给X赋值,所以都等于1。当Children1被分配2时,值会发生变化,但Children2仍然是以前的1。当父类修改为3时,因为Children2从未赋值,所以等于修改后的父类3的x值,直到Children2自身赋值后才是4。

  2.比如变量Y,child1和child2一开始都没有给Y赋值,所以都等于1。当child1变成2,它就变成2,但child2还是之前的1。即使父类实例par将y的值更改为3,child2仍然是1。直到child2给自己赋值4,它才会改变。

  例二,GrandChildren继承自Children,Children继承自Parent

  class Parent(object):x=1 def _ _ init _ _(self):self。y=1类孩子(父母):通过类孙辈(Children):passpar=Parent()child=Children()grand=sun seconds()print( Parent . x=,Parent。x=,Children.x=,Children.x=,sunseconds。x=,太阳秒。x . x)打印( par.y=,par。y, child.y=,child.y=,grand.y=,grand.y)print( - )Children .输出结果:

  - Parent.x=1,Children.x=1,孙辈。x=1par.y=1,child.y=1,grand.y=1 - Parent.x=1,Children.x=2,孙子辈。x=1,孩子。y=2,grand.y=1 - Parent.x=3,Children.x=2,孙子辈。x=2par.y=3,孩子。y=2,grand.y=1 - Parent.x=3,Children.x=2,孙子辈。x=4par.y总结:

  1,对于类变量x,最开始孩子们和孙都没有赋值x,所以都等于1。当孩子们赋值2之后值就变了,孙辈也跟着变,当父类修改后,由于儿童2在之前赋值为2,所以即使修改了父类的x,但也不会访问到他1000个孙子孙女。自己赋值为3就会变成4,不影响父母和孙子孙女们。

  2,对于实例变量y,最开始儿童和宏伟的都没有对y赋值,所以都等于1。当儿童变成2之后就变成2,但宏伟的还是最开始的初值1,即使父类实例票面价值改变y的值为3000美元还是1。直到宏伟的自己赋值为四才改变。

  例三、GrandChildren继承自Children1和Children2,Children1继承自Parent,Children2继承自Parent

  类父(对象):x=1 #类变量def __init__(self): self.y=1 #实例变量类children 1(Parent):pass类children 2(Parent):def _ _ init _ _(self):Parent .__init__(self) self.y=90class孙辈(Children1,children 2):passpar=Parent()children 1=children 1()children 2=children 2()grand=children()print(-)print( Parent=,Parent.x,,Children1.x=,Children1.x=,Children1.x=,Children1.x=,Children2.x,,Children2.x=,孙子辈。x)print(par.y=,par.y,,child1.y=,child 2 .输出结果

  - Parent=1,Children1.x=1,Children2.x=1,孙辈x=1par.y=1,Children1.x=1,children 2 . y=90,grand.y=90 - Parent=1,Children1.x=2,Children2.x=1,孙辈x=2par.y=1,children 1 . y=2,children 2 . y=90,grand.y=90 - Parent=1,Children1.x=2,Children2.x=3,孙辈x=2py=90 -父母=1,子女1.x=2,子女2.x=3,grand

  1,对于类变量X,刚开始,Children1,Children2和孙辈没有给X赋值,所以都等于1。当Children1被分配给2时,值会发生变化,但Children2仍然是以前的1。由于孙辈先继承Children1,所以等于修改后Children1的X值,即使Children2修改为3,孙辈也取Children1的值,直到孙辈赋值自己的值才是4。

  2.比如变量Y,一开始child1没有给Y赋值,所有搜索到的父类值都是1,但是child2的初始值是90,所以是90。grand未初始化。首先搜索child1,然后继续搜索child2。此时进行初始化,所以grand的初始值为90。当child1赋值为2时,就变成了2,child2还是之前的90,grand也是90。即使将child1和child2的值都重置为初始值,grand仍然是第一个90。直到grand自己赋值4才改变。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: