#!/usr/bin/env python3 # Copyright 2014 Brett Slatkin, Pearson Education Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Preamble to mimick book environment import logging from pprint import pprint from sys import stdout as STDOUT # Example 1 class Homework(object): def __init__(self): self._grade = 0 @property def grade(self): return self._grade @grade.setter def grade(self, value): if not (0 <= value <= 100): raise ValueError('Grade must be between 0 and 100') self._grade = value # Example 2 galileo = Homework() galileo.grade = 95 print(galileo.grade) # Example 3 class Exam(object): def __init__(self): self._writing_grade = 0 self._math_grade = 0 @staticmethod def _check_grade(value): if not (0 <= value <= 100): raise ValueError('Grade must be between 0 and 100') # Example 4 @property def writing_grade(self): return self._writing_grade @writing_grade.setter def writing_grade(self, value): self._check_grade(value) self._writing_grade = value @property def math_grade(self): return self._math_grade @math_grade.setter def math_grade(self, value): self._check_grade(value) self._math_grade = value # Example 5 galileo = Exam() galileo.writing_grade = 85 galileo.math_grade = 99 print('Writing: %5r' % galileo.writing_grade) print('Math: %5r' % galileo.math_grade) # Example 6 class Grade(object): def __get__(*args, **kwargs): pass def __set__(*args, **kwargs): pass class Exam(object): # Class attributes math_grade = Grade() writing_grade = Grade() science_grade = Grade() # Example 7 exam = Exam() exam.writing_grade = 40 # Example 8 Exam.__dict__['writing_grade'].__set__(exam, 40) # Example 9 print(exam.writing_grade) # Example 10 print(Exam.__dict__['writing_grade'].__get__(exam, Exam)) # Example 11 class Grade(object): def __init__(self): self._value = 0 def __get__(self, instance, instance_type): return self._value def __set__(self, instance, value): if not (0 <= value <= 100): raise ValueError('Grade must be between 0 and 100') self._value = value class Exam(object): math_grade = Grade() writing_grade = Grade() science_grade = Grade() # Example 12 first_exam = Exam() first_exam.writing_grade = 82 first_exam.science_grade = 99 print('Writing', first_exam.writing_grade) print('Science', first_exam.science_grade) # Example 13 second_exam = Exam() second_exam.writing_grade = 75 print('Second', second_exam.writing_grade, 'is right') print('First ', first_exam.writing_grade, 'is wrong') # Example 14 class Grade(object): def __init__(self): self._values = {} def __get__(self, instance, instance_type): if instance is None: return self return self._values.get(instance, 0) def __set__(self, instance, value): if not (0 <= value <= 100): raise ValueError('Grade must be between 0 and 100') self._values[instance] = value # Example 15 from weakref import WeakKeyDictionary class Grade(object): def __init__(self): self._values = WeakKeyDictionary() def __get__(self, instance, instance_type): if instance is None: return self return self._values.get(instance, 0) def __set__(self, instance, value): if not (0 <= value <= 100): raise ValueError('Grade must be between 0 and 100') self._values[instance] = value # Example 16 class Exam(object): math_grade = Grade() writing_grade = Grade() science_grade = Grade() first_exam = Exam() first_exam.writing_grade = 82 second_exam = Exam() second_exam.writing_grade = 75 print('First ', first_exam.writing_grade, 'is right') print('Second', second_exam.writing_grade, 'is right')