Python значение экземпляров
Вопрос: при создании экземпляра класса, делаеться ли отметка того, каким он должен быть? К примеру, если я создам экземпляр класса, и потом через @classmetod изменю какое-то значение, то оно и будет в экземпляре, которого я создал ранее? Если да, то почему?
Ответы (1 шт):
У экземпляра есть аттрибуты двух видов. Одни являются собственными аттрибутами экземпляра. Если вы их меняете, то они меняются только у одного этого экземпляра. Второй вид аттрибутов - это аттрибуты класса, и они общие для всех экземпляров этого класса. И да, если вы их меняете (например, как вы написали, через classmethod), то они меняются для всех экземпляров этого класса. В том числе и тех, которые были созданы ранее.
Хотя, на самом деле, даже не совсем верно говорить, что они меняются для всех экземпляров, потому что они не хранятся в экземплярах, а хранятся только в классе. Экземпляр просто может читать этот аттрибут из класса.
Вот код, который иллюстрирует это:
class Example:
a = 1 # Это аттрибут класса. Он общий для всех экземпляров
def __init__(self):
self.b = 7 # А это собственный аттрибут экземпляра.
# У каждого экземпляра он свой.
@classmethod
def increment_a(cls):
cls.a += 1 # Увеличиваем аттрибут "a" на единицу
def increment_b(self):
self.b += 1 # Увеличиваем аттрибут "b" на единицу
object_1 = Example()
object_2 = Example()
object_2.increment_a()
object_2.increment_b()
print(object_2.a) # Выведет 2
print(object_2.b) # Выведет 8
print(object_1.a) # Выведет 2.
# Общий аттрибут увеличился и у первого экземпляра тоже
print(object_1.b) # Выведет 7.
# Собственный аттрибут у первого экземпляра не изменился.