Как изменить переменную экземпляра в python с помощью метода? - PullRequest
0 голосов
/ 14 февраля 2020

Я очень плохо знаком с python и сейчас практикую OOP. Одна из проблем, с которой я сталкиваюсь, заключается в том, как изменить переменную экземпляра в python с помощью метода. Мой код:

class Monster:
   def __init__ (self, name, health):
      self.name = name
      self.health = health
   @classmethod
   def change_name (self, given_name):
      self.name = given_name
mon = Monster("Drake", 100)
print(mon.name)
mon.change_name("Derrick")
print(mon.name)

Вывод:

#Expected:
Drake 
Derrick
#Actual:
Drake
Drake

Может кто-нибудь сказать мне, в чем проблема и как я могу ее решить?

1 Ответ

3 голосов
/ 14 февраля 2020

Это происходит потому, что метод change_name объявлен как classmethod

. Это означает, что его параметр self является не объектом (экземпляром класса), а классом, фактически вы должны переименовать cls, чтобы было понятно.

Назначение переменной tbe через класс создает ее в пространстве имен класса, а не в объекте.

Но при поиске через объект python ищет его в пространстве имен объекта и, если он не может быть найден, он ищет его в классе '(и выше в суперклассах', если он еще не найден)

Так как он вам, кажется, не нужен поскольку атрибут name принадлежит каждому экземпляру монстра, решение состоит в том, чтобы сделать метод простым экземпляром, удалив декоратор @classmethod.

...