#------------------------------------------------------------------------------ # person.py # Definition of the Person, class and related subclasses. #------------------------------------------------------------------------------ import random # Global random number generator for generating id numbers. # Using a seed causes the same random numbers on every run. rng = random.Random(8723) class Person(object): """Class representing a person.""" def __init__(self, s='No Name'): """Initialize a Person object.""" if not isinstance(s, str): msg = f'Person must be initialized with str, not {type(s).__name__}' raise TypeError(msg) # end self._name = s # end def __str__(self): """Return string representation of self.""" return self._name # end def __repr__(self): """Return a detailed string representation of self.""" return f"person.{type(self).__name__}( '{self._name}' )" # end @property def first_name(self): """Return first name of self.""" return self._name.split()[0] # end @property def last_name(self): """Return last name of self.""" return self._name.split()[-1] # end @property def full_name(self): """Return full name of self, last name first.""" last = self.last_name rest = ' '.join(self._name.split()[:-1]) return f'{last}, {rest}' # end # end class Student(Person): """Class representing a Student, subclass of Person.""" def __init__(self, s): """Initialize a Student object.""" super().__init__(s) self._student_id = '{:0>7}'.format(rng.randint(10, 10**7)) # end def __str__(self): """Return a string representation of self.""" return super().__str__()+', sid: '+self.student_id # end @property def student_id(self): """Return student id number.""" return self._student_id # end # end class Employee(Person): """Class representing an Employee, subclass of Person.""" def __init__(self, s): """Initialize an Employee object.""" super().__init__(s) self._employee_id = '{:0>8}'.format(rng.randint(10, 10**8)) # end def __str__(self): """Return a string representation of self.""" return super().__str__()+', eid: '+self.employee_id # end @property def employee_id(self): """Return employee id number.""" return self._employee_id # end # end class StudentEmployee(Student, Employee): """ Class representing a Student Employee, subclass of both Student and Employee. """ def __init__(self, s): """Initialize an Student Employee object.""" super().__init__(s) # end def __str__(self): """Return a string representation of self.""" return super().__str__() # end # end # test Person class(es) def main(): A = Person() # try putting something not str as argument B = Person('William H. Bradshaw') C = Student('Barbara K. Crawford') D = Employee('Thomas W. Holder') E = StudentEmployee('Karen Jean Bryce-Jennings') print() print(A) print() print(B) print(repr(B)) print(B.first_name) print(B.last_name) print(B.full_name) print() print(C) print(repr(C)) print() print(D) print(repr(D)) print() print(E) print(repr(E)) print() # end #------------------------------------------------------------------------------ if __name__=='__main__': main() # end