+ 2

Python class member variable

I saw this following question on Python quiz. class Test: def __init__(self, v = 1): self.__num = v def get_num(self): return self.__num t = Test(2) t.__num = 3 print(t.get_num()) The output of this code is 2. But my understanding says it should be 3. Can somebody explain why is this so?

28th Jan 2018, 7:10 PM
Ravi Chandra Enaganti
Ravi Chandra Enaganti - avatar
5 Respostas
+ 3
I got the answer myself. If you declare a member variable with two underscores before it, python interpreter does something called 'name mangling'. Because of this, the __num is changed to _Test__name. If I change my code like the following. class Test: def __init__(self, v = 1): self.__num = v def get_num(self): return self.__num t = Test(2) t._Test__num = 3 print(t.get_num()) It prints 3 as expected. I reffered the following link https://hackernoon.com/understanding-the-underscore-of-python-309d1a029edc
28th Jan 2018, 7:50 PM
Ravi Chandra Enaganti
Ravi Chandra Enaganti - avatar
+ 3
That's interesting, I never knew that!
28th Jan 2018, 8:03 PM
Faisal
Faisal - avatar
+ 2
The reason that it is returning 2 is because the variable num is private, meaning that it can't be called from outside the class. Because of this, the only way that you can set num without using a setter method is by setting it when the object is created.
28th Jan 2018, 7:18 PM
Faisal
Faisal - avatar
+ 2
@Faisal, Thanks for the clarification. So when I assigned t.__num = 3, it has not updated the actual __num member but another member variable with same name. If I print (t.__num), it prints 3. So in python it is possible to have two members variables with the same name?
28th Jan 2018, 7:32 PM
Ravi Chandra Enaganti
Ravi Chandra Enaganti - avatar
+ 1
Huh, not too sure about that. I think it may be because of what you're using to return the variable, as the getter method may only return the set variable and explicitly referring to the variable may return the value that you have set it. Still not sure about that though, sorry!
28th Jan 2018, 7:43 PM
Faisal
Faisal - avatar