Я прочитал много вопросов, размещенных в ссылках на переменные в Python, но все еще происходит, когда я играю с кодом, который я бы не ожидал, и его довольно разочаровывающим. Возьмите этот кусок кода:Ссылка на Python для переменных класса и экземпляра
class MyClass(object) :
class_var = "original message" # same for all objects
def __init__(self, instance_var) :
self.instance_var = instance_var #particular to the object
my_object = MyClass("my instance variable")
untouched_object = MyClass("another instance_var")
# Values of class_var and instance_var as expected
MyClass.class_var = "changed message"
# attribute class_var has changed for both objects
# This changes attribute class_var for my_object only
my_object.class_var = "I am my_object"
# THIS ONLY CHANGES ATTRIBUTE CLASS_VAR FOR UNTOUCHED_OBJECT ONLY!
MyClass.class_var = "Last message"
print MyClass.class_var #prints Last Message
print my_object.class_var #prints I am my_object ???
print untouched_object.class_var #prints Last Message
Что здесь происходит? Когда я создаю объект некоторого класса с переменной класса, кажется, что object.class_attribute
изначально содержит указатель на Class.class_var
, и я могу изменить атрибут для всех объектов, назначив Class.class_var
. Но если я явно присваиваю атрибуту object.class
какое-то другое значение, указатель исчезает, а изменение Class.class_var
больше не влияет на этот конкретный объект, а только на все остальные экземпляры. Это что здесь происходит? Кроме того, почему мы могли бы получить доступ и изменить атрибут класса таким образом и потенциально потерять доступ к значению, которое должно быть известно всем документам Python Documentation?
Спасибо, это начинает иметь смысл. Одна вещь, однако, я вижу много кода, ссылающегося на переменные класса внутри класса как 'self.class_var'. Почему бы им не использовать «Class.class_var»? – bmcentee148
Ну, 'self.class_var' делает то, что вам нужно, когда вы просто читаете атрибут класса. И 'self' легче вводить, чем' MyClass' :) Я предполагаю, что соглашение должно явно использовать «MyClass.class_var» только в редких случаях, когда вы на самом деле пытаетесь изменить атрибут класса. –