原标题:python类变量和实例变量在继承中如何取值
一、python类变量在继承中取值方式如下:
1,如果一个变量的名字在当前类的字典中没有,将搜索父类直到被引用的变量名被找到,多继承时会按照继承顺序依次找,如果一直到最顶级都没有找到会引发一个 AttributeError 异常 。
2,如果该变量在该类中有定义,则使用该值。
二、python实例变量在继承中取值方式如下:
1,继承之后的类的实例变量只会继承最开始的初始值,即使父类中的实例变量值改变子类的值也不会跟着改变
三、举例证明
运行环境:python3.6
例一,继承关系Children1继承自Parent,Children2也继承自Parent。
class Parent(object):
x = 1 # 类变量
def __init__(self):
self.y = 1 # 实例变量
class Children1(Parent):
pass
class Children2(Parent):
pass
par = Parent() # 实例对象
child1 = Children1()
child2 = Children2()
print('-------------------------------------')
print('Parent.x=', Parent.x, ',Children1.x=', Children1.x, ',Children2.x=', Children2.x)
print('par.y=', par.y, ',child1.y=', child1.y, ',child2.y=', child2.y)
print('-------------------------------------')
Children1.x = 2
child1.y = 2
print('Parent.x=', Parent.x, ',Children1.x=', Children1.x, ',Children2.x=', Children2.x)
print('par.y=', par.y, ',child1.y=', child1.y, ',child2.y=', child2.y)
print('-------------------------------------')
Parent.x = 3
par.y = 3
print('Parent=', Parent.x, ',Children1=', Children1.x, ',Children2=', Children2.x)
print('par.y=', par.y, ',child1.y=', child1.y, ',child2.y=', child2.y)
print('-------------------------------------')
Children2.x = 4
child2.y = 4
print('Parent=', Parent.x, ',Children1=', Children1.x, ',Children2=', Children2.x)
print('par.y=', par.y, ',child1.y=', child1.y, ',child2.y=', child2.y)
输出结果:
-------------------------------------
Parent.x= 1 ,Children1.x= 1 ,Children2.x= 1
par.y= 1 ,child1.y= 1 ,child2.y= 1
-------------------------------------
Parent.x= 1 ,Children1.x= 2 ,Children2.x= 1
par.y= 1 ,child1.y= 2 ,child2.y= 1
-------------------------------------
Parent.x= 3 ,Children1.x= 2 ,Children2.x= 3
par.y= 3 ,child1.y= 2 ,child2.y= 1
-------------------------------------
Parent.x= 3 ,Children1.x= 2 ,Children2.x= 4
par.y= 3 ,child1.y= 2 ,child2.y= 4
总结:
1,对于类变量x,最开始Children1和Children2都没有赋值x,所以都等于1。当Children1赋值2之后值就变了,但Children2还是之前的1,当父类修改为3后,由于Children2一直没有赋值,所以等于修改后的父类的x值3,直到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
class Children(Parent):
pass
class GrandChildren(Children):
pass
par = Parent()
child = Children()
grand = GrandChildren()
print('-------------------------------------')
print('Parent.x=', Parent.x, ',Children.x=', Children.x, ',GrandChildren.x=', GrandChildren.x)
print('par.y=', par.y, ',child.y=', child.y, ',grand.y=', grand.y)
print('-------------------------------------')
Children.x = 2
child.y = 2
print('Parent.x=', Parent.x, ',Children.x=', Children.x, ',GrandChildren.x=', GrandChildren.x)
print('par.y=', par.y, ',child.y=', child.y, ',grand.y=', grand.y)
print('-------------------------------------')
Parent.x = 3
par.y = 3
print('Parent.x=', Parent.x, ',Children.x=', Children.x, ',GrandChildren.x=', GrandChildren.x)
print('par.y=', par.y, ',child.y=', child.y, ',grand.y=', grand.y)
print('-------------------------------------')
GrandChildren.x = 4
grand.y = 4
print('Parent.x=', Parent.x, ',Children.x=', Children.x, ',GrandChildren.x=', GrandChildren.x)
print('par.y=', par.y, ',child.y=', child.y, ',grand.y=', grand.y)
输出结果:
-------------------------------------
Parent.x= 1 ,Children.x= 1 ,GrandChildren.x= 1
par.y= 1 ,child.y= 1 ,grand.y= 1
-------------------------------------
Parent.x= 1 ,Children.x= 2 ,GrandChildren.x= 2
par.y= 1 ,child.y= 2 ,grand.y= 1
-------------------------------------
Parent.x= 3 ,Children.x= 2 ,GrandChildren.x= 2
par.y= 3 ,child.y= 2 ,grand.y= 1
-------------------------------------
Parent.x= 3 ,Children.x= 2 ,GrandChildren.x= 4
par.y= 3 ,child.y= 2 ,grand.y= 4
总结:
1,对于类变量x,最开始Children和GrandChildren都没有赋值x,所以都等于1。当Children赋值2之后值就变了,GrandChildren也跟着变,当父类修改后,由于Children2在之前赋值为2,所以即使修改了父类的x,但也不会访问到他。GrandChildren自己赋值为3就会变成4,不影响Parent和GrandChildren。
2,对于实例变量y,最开始child和grand都没有对y赋值,所以都等于1。当child变成2之后就变成2,但grand还是最开始的初值1,即使父类实例par改变y的值为3,grand还是1。直到grand自己赋值为4才改变。
例三、GrandChildren继承自Children1和Children2,Children1继承自Parent,Children2继承自Parent
class Parent(object):
x = 1
def __init__(self):
self.y = 1
class Children1(Parent):
pass
class Children2(Parent):
pass
class GrandChildren(Children1, Children2):
pass
par = Parent()
child1 = Children1()
child2 = Children2()
grand = GrandChildren()
print('-------------------------------------')
print('Parent=', Parent.x, ',Children1.x=', Children1.x, ',Children2.x=', Children2.x, ',GrandChildren.x=',
GrandChildren.x)
print('par.y=', par.y, ',child1.y=', child1.y, ',child2.y=', child2.y, ',grand.y=', grand.y)
print('-------------------------------------')
Children1.x = 2
child1.y = 2
print('Parent=', Parent.x, ',Children1.x=', Children1.x, ',Children2.x=', Children2.x, ',GrandChildren.x=',
GrandChildren.x)
print('par.y=', par.y, ',child1.y=', child1.y, ',child2.y=', child2.y, ',grand.y=', grand.y)
print('-------------------------------------')
Children2.x = 3
child2.y = 3
print('Parent=', Parent.x, ',Children1.x=', Children1.x, ',Children2.x=', Children2.x, ',GrandChildren.x=',
GrandChildren.x)
print('par.y=', par.y, ',child1.y=', child1.y, ',child2.y=', child2.y, ',grand.y=', grand.y)
print('-------------------------------------')
GrandChildren.x = 4
grand.y = 4
print('Parent=', Parent.x, ',Children1.x=', Children1.x, ',Children2.x=', Children2.x, ',GrandChildren.x=',
GrandChildren.x)
print('par.y=', par.y, ',child1.y=', child1.y, ',child2.y=', child2.y, ',grand.y=', grand.y)
输出结果
-------------------------------------
Parent= 1 ,Children1.x= 1 ,Children2.x= 1 ,GrandChildren.x= 1
par.y= 1 ,child1.y= 1 ,child2.y= 1 ,grand.y= 1
-------------------------------------
Parent= 1 ,Children1.x= 2 ,Children2.x= 1 ,GrandChildren.x= 2
par.y= 1 ,child1.y= 2 ,child2.y= 1 ,grand.y= 1
-------------------------------------
Parent= 1 ,Children1.x= 2 ,Children2.x= 3 ,GrandChildren.x= 2
par.y= 1 ,child1.y= 2 ,child2.y= 3 ,grand.y= 1
-------------------------------------
Parent= 1 ,Children1.x= 2 ,Children2.x= 3 ,GrandChildren.x= 4
par.y= 1 ,child1.y= 2 ,child2.y= 3 ,grand.y= 4
总结:
1,对于类变量x,最开始Children1、Children2和GrandChildren都没有赋值x,所以都等于1。当Children1赋值2之后值就变了,但Children2还是之前的1,由于GrandChildren先继承Children1,所以等于修改后的Children1的x值2,即使Children2修改值为3,GrandChildren也是取值于Children1,直到GrandChildren自己赋值才是4。
2,对于实例变量y,最开始child1、child2和grand都没有对y赋值,所以都等于1。当child1赋值2之后就变成2,但child2还是之前的1,grand也是1,即使child1和child2值都变了,grand还是为1。直到grand自己赋值为4才改变。返回搜狐,查看更多
责任编辑: