[Python-tut] Private Instance Variables
Author |
Message |
wtd
|
Posted: Tue Nov 08, 2005 3:54 pm Post subject: [Python-tut] Private Instance Variables |
|
|
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". |
|
|
|
|
|
Sponsor Sponsor
|
|
|
Mazer
|
Posted: Tue Nov 08, 2005 4:48 pm Post subject: (No subject) |
|
|
This is great! I was hoping that something like this existed. |
|
|
|
|
|
[Gandalf]
|
Posted: Tue Nov 08, 2005 4:53 pm Post subject: (No subject) |
|
|
Something I can learn . I'll go through it once I learn a bit more of the basics... |
|
|
|
|
|
|
|