Python значение экземпляров

Вопрос: при создании экземпляра класса, делаеться ли отметка того, каким он должен быть? К примеру, если я создам экземпляр класса, и потом через @classmetod изменю какое-то значение, то оно и будет в экземпляре, которого я создал ранее? Если да, то почему?


Ответы (1 шт):

Автор решения: Xander

У экземпляра есть аттрибуты двух видов. Одни являются собственными аттрибутами экземпляра. Если вы их меняете, то они меняются только у одного этого экземпляра. Второй вид аттрибутов - это аттрибуты класса, и они общие для всех экземпляров этого класса. И да, если вы их меняете (например, как вы написали, через 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.
                   # Собственный аттрибут у первого экземпляра не изменился.
→ Ссылка