使用python class变量的风险

class Parent(object):
    x = 1
class Child1(Parent):
    pass
class Child2(Parent):
    pass

print Parent.x, Child1.x, Child2.x
# 1 1 1

Child1.x = 2
print Parent.x, Child1.x, Child2.x
# 1 2 1

Parent.x = 3
print Parent.x, Child1.x, Child2.x
# 3 2 3

 

这段代码重点在第三次print结果“3 2 3”

当子类没有重新设置父类的变量时,会直接使用父类的变量,所以当父类变量发生变化时,Child2也发生变化。

 

我们可以用下面代码列出类的属性

print ', '.join(['%s:%s' % item for item in Child2.__dict__.items()])

 输出:

“Child2 __module__:__main__, __doc__:None”

 

可以看出里面是没有属性“x”的。所以会引用父类的x值。

 

对于并发运行多个子类的场景,子类使用class变量有可能导致value传递到其它子类。所以我们要明确在子类使用前对变量进行初始化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值