python的类变量和实例变量_python类变量和实例变量在继承中如何取值

原标题:python类变量和实例变量在继承中如何取值

一、python类变量在继承中取值方式如下:

1,如果一个变量的名字在当前类的字典中没有,将搜索父类直到被引用的变量名被找到,多继承时会按照继承顺序依次找,如果一直到最顶级都没有找到会引发一个 AttributeError 异常 。

2,如果该变量在该类中有定义,则使用该值。

二、python实例变量在继承中取值方式如下:

1,继承之后的类的实例变量只会继承最开始的初始值,即使父类中的实例变量值改变子类的值也不会跟着改变

三、举例证明

运行环境:python3.6

f2d1a1f484e443ce998fd15d0c852bf7.jpeg

例一,继承关系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才改变。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值