So you've created an object in Python:
Python: | class StudentRecord(object):
def __init__(self, name, grades = []):
self.name = name
self.grades = grades
def add_grade(self, new_grade):
self.grades.append(new_grade)
def max_grade(self):
return max(self.grades)
def min_grade(self):
return min(self.grades)
def avg_grade(self):
return float(sum(self.grades)) / len(self.grades) |
And you create an instance:
Python: | bob = StudentRecord("Bob", [100, 76, 89, 34]) |
Now, it's pretty obvious that if you call:
You should get 100. But what if I was an idiot and wrote:
What will Python do to stop me?
Python won't do a darn thing, because the grades list was public.
So, the question is how we go about making it private.
Python: | class StudentRecord(object):
def __init__(self, name, grades = []):
self.name = name
self.__grades = grades
def add_grade(self, new_grade):
self.__grades.append(new_grade)
def max_grade(self):
return max(self.__grades)
def min_grade(self):
return min(self.__grades)
def avg_grade(self):
return float(sum(self.__grades)) / len(self.__grades) |
That's great, but now how do I get to that list in a read-only fashion?
Python: | class StudentRecord(object):
def __init__(self, name, grades = []):
self.name = name
self.__grades = grades
def add_grade(self, new_grade):
self.__grades.append(new_grade)
def max_grade(self):
return max(self.__grades)
def min_grade(self):
return min(self.__grades)
def avg_grade(self):
return float(sum(self.__grades)) / len(self.__grades)
def __get_grades(self):
return self.__grades
grades = property(__get_grades) |
Or alternatively:
Python: | class StudentRecord(object):
def __init__(self, name, grades = []):
self.name = name
self.__grades = grades
def add_grade(self, new_grade):
self.__grades.append(new_grade)
def max_grade(self):
return max(self.__grades)
def min_grade(self):
return min(self.__grades)
def avg_grade(self):
return float(sum(self.__grades)) / len(self.__grades)
grades = property(lambda self: self.__grades) |
The property function can also be used to create "setters" as well as "getters". |