【问题标题】:Changing class variable doesn't affect object's value更改类变量不会影响对象的值
【发布时间】:2018-06-07 20:40:30
【问题描述】:

我正在尝试说明需要实例变量的原因并使用self。所以我想出了下面的例子。然而,事情并没有像我想象的那样发展,哈哈。我来呼吁大家回答我的问题:虽然我正在更改类变量,但为什么最后一个带有x.one 的打印语句没有打印出-1

class example():
  one = 1
  two = 2

# Creating 2 'example' objects, x and y
x = example()
y = example()
print("x is: ", x.one, "y is: ", y.one) # output: x is 1, y is 1

# From the print statement, we'll see that changing one class object does not affect another class object
x.one = 0
print("x is: ", x.one, "y is: ", y.one) # output: x is 0, y is 1

# But what if we changed the class itself?
example.one = -1
print("x is: ", x.one, "y is: ", y.one) # output: x is 0, y is -1

我的猜测是它与我在上面的块中更改x.one 的值有关,这使得x.one 可能在内存中拥有一个新位置,而不是引用example.one 在内存中的位置。

如果您能给我一个更详细的原因,我将非常感激,并能够将知识传授给我的学生。

【问题讨论】:

    标签: class object variables python-2.x


    【解决方案1】:

    开始时,没有定义实例属性,只有类属性onetwo。所以当你问实例xy他们的属性one时,他们首先检查他们是否有实例属性,看他们没有,从而报告类属性。

         Instance    Class
    x                 *1*
    y                 *1*
    

    当您分配给x.one 时,此创建实例属性one 在实例x 上。所以当你再次询问他们时,这次x 报告了它自己的实例值oney 仍然报告类属性。

         Instance    Class
    x      *0*         1
    y                 *1*
    

    当您随后更改类属性one 时,这不会更改x,因为它的实例属性one 仍然优先于类属性。你看到y的区别,因为它仍然没有任何实例属性,因此继续报告类属性。

         Instance    Class
    x      *0*        -1
    y                *-1*
    

    【讨论】:

    • 我很喜欢。也感谢您的示例。就我个人所知,这个解释是否与我的猜测相似,但更多的是在“编程级别”而不是“内存级别”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多