[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... | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		 | 
	 
 
	
	
	 
	
	 |