I am learning getters and setters , what I understand is that they are used so that no one could change the object's attributes directly. In the example
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
def get_age(self):
return self._age
def set_age(self, new_age):
if isinstance(new_age, int) & new_age>0 & new_age<120:
self._age = new_age
def get_name(self):
return self._name
def __str__(self):
return 'Person[' self._name '] is ' str(self._age)
p1 = Person("Sandeep", 49)
I created an object p1
where I set the age 49. As I have made a set_age
function so I expect we can change the age of p1
through set_age
only, not through the routine way. But it is not happening, I am able to change the age of p1
through , for example, p1._age = 35
as well. Then, what is the advantage to make set_age
function, if I am still able to access the attributes directly?
I think, I am missing something, please help.
CodePudding user response:
what I understand is that they are used so that no one could change the object's attributes directly.
Your understanding is wrong. There is no magic rule that tells the python interpreter oh, this class has a setter, so direct access to the fields aren't allowed any more
.
In other words: this is merely "works by convention". When you see a python class that has setter methods, then you know you should not access the fields directly, although you still can do that.
And note: python is mostly rather lenient on such things. A lot of things are "by convention" only. It is just "the nature" of python: you can do a lot of things that other languages, especially statically typed ones like Java do not allow.
CodePudding user response:
You need to tell python how to associate the getter and setter with the actual variable name. To do this you can use the builtin property
function like so:
class Person
def __init__(self, name, age):
self._name = name
self._age = age
def get_age(self):
return self._age
def set_age(self, new_age):
if isinstance(new_age, int) & new_age>0 & new_age<120:
self._age = new_age
def get_name(self):
return self._name
name = property(get_name)
age = property(get_age, set_age)
def __str__(self):
return 'Person[' self.name '] is ' str(self.age)
p1 = Person("Sandeep", 49)
Then instead of referring to _name
and _age
use name
and age
CodePudding user response:
Now I realise that I asked a silly question. The reason is obvious of using setters
, creating functions for setting a value is a very convenient way to apply the constraints on it. In the example above, the constraint is that the age of the person should be positive and less than 120. Implementation of such constraints is not possible without setters
.