Riley Jones
Riley Jones

Reputation: 43

How to change an instance variable in python using a method?

I'm very new to python and currently practicing OOP. One of the problems I'm facing is how to change an instance variable in python using a method. My code:

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)

Output:

#Expected:
Drake 
Derrick
#Actual:
Drake
Drake

Can someone tell me what the problem is and how I can solve it?

Upvotes: 0

Views: 2453

Answers (1)

Pynchia
Pynchia

Reputation: 11590

It happens because the change_name method is declared as a classmethod

Which means its self parameter is not the object (instance of the class) but the class, in fact you should rename it to cls to make it clear.

Assigning tbe variable via the class creates it in the class' namespace, not in the object's.

But when looked up via the object, python looks for it in the object's namespace and if it cannot be found, it looks for it in the class' (and above in the superclasses' if not found yet)

Since you do not seem to need it , as the name attribute belongs to each monster instance, the solution is to make the method a plain instance one by removing the @classmethod decorator.

Upvotes: 3

Related Questions