Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 29, 2019 17:20:23

AIP
Зарегистрирован: 2016-10-19
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про classmethod

Здравствуйте.
У нас есть класс

 class A:
    foo = 1
    @classmethod
    def change_foo(cls, value):
        cls.foo = value

Создаем несколько экземпляров этого класса
 a = A()
 b = A()
 c = A()

Для всех созданных классов значение foo будет равно 1.
Далее в одном из этих классов меняем значение
 a.foo = 2
Соответственно значение foo в классе b и с осталось неизменным и равно 1, а в классе a изменилось на 2.
Теперь при помощи функции change_foo меняем переменную. Менять можно как через класс, так и через объект, результат не меняется.
 a.change_foo(3)
или
 b.change_foo(3)
или
 A.change_foo(3)

В итоге имеем, что в классе “b” и “c” значение поменялось на новое(3), а в классе “a” нет(осталось значение 2). Почему это происходит?

Офлайн

#2 Апрель 29, 2019 18:08:04

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Вопрос про classmethod

  a.foo = 2
Как работают классы в Питоне, еще до конца не понимаю, но здесь, судя по всему, ты создаешь поле foo уже у объекта а: у поля класса одно значение, у поля объекта - другое

Отредактировано Egorro13 (Апрель 29, 2019 18:08:14)

Офлайн

#3 Апрель 30, 2019 02:45:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Вопрос про classmethod

AIP
Почему это происходит?
Потому что объекты b и c всё ещё используют переменную класса A, а объект a с самого начала использует переменную экземпляра a. Когда ты присвоил a.foo значение, это имя отвязалось от класса и привязалось к экземпляру.

Здесь довольно размазанная инфа, но если всю главу читаешь целиком и с разбором (помня предыдущие главы), то всё понятно про переменные класса и экземпляра
DIP3. переменные экземпляра
DIP3. переменные класса



Отредактировано py.user.next (Апрель 30, 2019 02:50:11)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version