Изменение переменной класса не влияет на значение объекта - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь объяснить причину необходимости переменных экземпляра и использую self.Итак, я придумал следующий пример.Однако, все идет не так, как я думал, ха-ха.Я обратился ко всем вам с просьбой ответить на мой вопрос: хотя я изменяю переменную класса, почему последнее утверждение print с 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 в памяти.

Если бы вы могли дать мне более подробную причину, я был бы очень признателен за это и смог бы передать знания моему ученику.

1 Ответ

0 голосов
/ 07 июня 2018

Когда вы начали, не было определено ни одного атрибута экземпляра, только атрибуты класса one и two.Поэтому, когда вы спрашиваете экземпляры x и y об их атрибуте one, они сначала проверяют, есть ли у них атрибут экземпляра, видят, что их нет, и, таким образом, сообщают об атрибуте класса.

     Instance    Class
x                 *1*
y                 *1*

Когда вы присвоили x.one, создал атрибут экземпляра с именем one в экземпляре x.Поэтому, когда вы спросите их снова, на этот раз x сообщит свое собственное значение экземпляра one.y по-прежнему сообщает атрибут класса.

     Instance    Class
x      *0*         1
y                 *1*

Когда вы затем изменяете атрибут класса one, это не меняет x, поскольку его атрибут экземпляра one по-прежнему имеет приоритет над классомприписывать.Вы видите разницу в y, потому что он все еще не имеет какого-либо атрибута экземпляра и, таким образом, продолжает сообщать атрибут класса.

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