# 定义大学人事管理系统需要的人事信息类 # 包括表示各种教职员工的类,表示各种类别学生的类 # 首先定义一个通用的人员类 import datetime class Person: def __init__(self, name, sex, birthday): if not (isinstance(name, str) and sex in ("女", "男") and isinstance(birthday, tuple) and len(birthday) == 3): raise ValueError(name, sex, birthday) birth = datetime.date(*birthday) # 生成一个日期对象 self._name = name self._sex = sex self._birthday = birth def set_name(self, name): # 修改名字 if not isinstance(name, str): raise ValueError self._name = name def name(self): return self._name def sex(self): return self._sex def birthday(self): return self._birhtday def age(self): return (datetime.date.today().year - self._birthday.year) def __lt__(self, another): if not isinstance(another, Person): raise TypeError return self._name < another._name def __str__(self): return " ".join((self._name, self._sex, str(self._birthday))) def print(self): print(self._name, self._sex, self._birthday) class UniPerson(Person): _num = 0 def __init__(self, name, sex, birthday, ident): Person.__init__(self, name, sex, birthday) self._id = ident UniPerson._num += 1 # 实例计数 def id(self): return self._id def __lt__(self, another): if not isinstance(another, UniPerson): raise TypeError return self._id < another._id @classmethod def num(cls): return UniPerson._num def __str__(self): return " ".join((self._id, self._name, self._sex, str(self._birthday))) class Student(UniPerson): _id_num = 0 @classmethod def _id_gen(cls): # 实现学号生成规则 Student._id_num += 1 return "1{:09}".format(Student._id_num) def __init__(self, name, sex, birthday, department): UniPerson.__init__(self, name, sex, birthday, Student._id_gen()) self._department = department self._enroll_date = datetime.date.today() self._courses = {} # 一个空字典 def set_course(self, course_name): self._courses[course_name] = None def set_score(self, course_name, score): self._courses[course_name] = score # 其他必要的方法定义从略 class UGStudent(Student): def __init__(self, name, sex, birthday, department, sclass): Student.__init__(self, name, sex, birthday, department) self._class = sclass class MasterStudent(Student): def __init__(self, name, sex, birthday, department): Student.__init__(self, name, sex, birthday, department) self._id = self._id[:3] + "5" + self._id[4:] self._supervisor = "Undetermined" # 导师未定 self._field = "Undetermined" # 研究领域未定 class DoctorStudent(Student): def __init__(self, name, sex, birthday, department, field, supervisor): Student.__init__(self, name, sex, birthday, department) self._id = self._id[:3] + "8" + self._id[4:] self._supervisor = supervisor self._field = field class Staff(UniPerson): _id_num = 0 @classmethod def _id_gen(cls, birthday): # 实现职工号生成规则 Staff._id_num += 1 birth_year = datetime.date(*birthday).year return "0{:04}{:05}".format(birth_year, Staff._id_num) def __init__(self, name, sex, birthday, entrydate=None): UniPerson.__init__(self, name, sex, birthday, Staff._id_gen(birthday)) if entrydate: self._entrydate = datetime.date(*entrydate) else: self._entrydate = datetime.date.today() self._salary = 1720 # 默认设为最低工资, 可修改 self._department = None # 由具体类设定 self._position = None # 由具体类设定 def set_salary(self, amount): if not type(amount) is int: raise TypeError self._salary = amount def print(self): print(self.id(), self._name, self._sex, str(self.age()) + "-years") ##class StaffMaster(Staff, MasterStudent): ## def __init__(self, name, sex, birthday, entrydate=None): ## pass ## #### 下面代码用于检查属性查询路径 ## @classmethod ## def info(cls): ## return cls.__mro__ # 得到一个类表,是方法检索路径 ## ##print(StaffStudent.info()) ###### 说明动态方法约束的例子 ##class B: ## def g(self): ## print("B.g is called.") ## def f(self): ## print("B.f is called.") ## self.g() ## ##class C(B): ## def g(self): ## print("C.g is called.") ## ##x = C() # 没有初始化函数,生成空对象 ##x.f() # 输出什么? if __name__ == '__main__': def test_Person(): global plist1 p1 = Person("谢雨洁", "女", (1995, 7, 30)) p2 = Person("汪力强", "男", (1990, 2, 17)) p3 = Person("廖晓溪", "女", (1996, 10, 16)) p4 = Person("李羽辛", "男", (1994, 5, 24)) p1.print() p2.print() p3.print() p4.print() print("\nTest x.age():") print(p1.name(), p1.age(), "years") print(p2.name(), p2.age(), "years") print("\nTest __str__:") print(p1) print(p2) print("\nAfter sorting:") plist1 = [p1, p2, p3, p4] plist1.sort() for p in plist1: p.print() # test_Person() def test_UniPerson(): global plist2 p1 = UniPerson("谢雨洁", "女", (1995, 7, 30), "1400010111") p2 = UniPerson("汪力强", "男", (1990, 2, 17), "1300080324") p3 = UniPerson("张加琳", "女", (1974, 10, 16), "0006174132") p4 = UniPerson("李国栋", "男", (1962, 5, 24), "0006262018") plist2 = [p1, p2, p3, p4] for p in plist2: p.print() print("\nAfter sorting:") plist2.sort() for p in plist2: print(p) print("\nPeople created:", UniPerson.num()) # test_UniPerson() def test_Student(): global student_list p1 = UGStudent("谢雨洁", "女", (1995, 7, 30), "数学", 3) p2 = MasterStudent("汪力强", "男", (1990, 2, 17), "物理") p3 = DoctorStudent("李加林", "男", (1989, 4, 10), "化学", "有机化学", "刘小勇") print(p1) print(p2) print(p3) student_list = [p1, p2, p3] # test_Student() def test_Staff(): global staff_list p1 = Staff("张加琳", "女", (1974, 10, 16)) p2 = Staff("李国栋", "男", (1962, 5, 24)) p1.print() p2.print() staff_list = [p1, p2] # test_Staff() print("\nTotal number of the people:", UniPerson.num())