求助:类中声明的类实例被所有类实例共享的问题
问题原因解析
嘿,我来帮你搞定这个问题!你遇到的其实是Python里类变量和实例变量的常见坑——你把Person类里的state定义成了类变量,导致所有Person实例共享同一个State对象啦!
你看,原代码里Person类中的state = State()是直接写在类体里的,这属于类变量,它绑定在Person类本身,所有通过这个类创建的实例都会共用这同一个State对象。所以当你修改jill.state.awake时,本质上是在修改那个共享的State对象的属性,自然jack.state.awake也会跟着变化。
解决方法
要解决这个问题很简单,我们只需要把state变成每个实例独有的实例变量,也就是把它放到Person类的__init__方法里,用self.state来定义。这样每次创建Person实例时,都会生成一个全新的State对象,各个实例的状态就完全独立了。
修改后的代码如下:
# 创建State类 class State(object): awake = False # 设置Person类 class Person(object): def __init__(self): # 每个实例初始化时创建专属的State对象 self.state = State() # 创建Person实例 jack = Person() jill = Person() print(jack.state.awake) print(jill.state.awake) # 只唤醒jill jill.state.awake = True print("") print(jack.state.awake) print(jill.state.awake)
运行结果
False False False True
额外优化提示
另外提一嘴,原State类里的awake也是类变量,虽然这次的问题主要出在Person的state上,但如果后续你想让每个State实例有自己独立的awake状态,最好也把它移到State的__init__方法里,写法更规范,还能避免其他潜在的坑:
class State(object): def __init__(self): self.awake = False
内容的提问来源于stack exchange,提问作者Ymitzna
相关产品推荐
相关产品推荐

