python实现大学人员管理系统
python作为一个面对对象的程序设计语言,实现一个人员管理系统有自己关于类的方法。
首先,通过定义一个人员的类对象,实现对于人员公共特性的支持,公共的特性包括:姓名,性别,出生日期等,用一个Person类来表示。大学里总的来说分为两种身份的人:学生(Student)和职工(Staff),这两种有自己的特性,比如学生信息就有学号,课程,成绩等;职工有职工号,职位,薪水等。
利用python类对象的继承机制我们就可以很方便的表示这两种身份的人。
我们首先定义一个Person类,这个类用于保存共有的特性
importdatetime classPersonValueError(ValueError): pass classPersonTypeError(TypeError): pass classPerson: _num=0 #类属性,这个属性在类内使用(_X)属性一般默认只能在类内使用 def__init__(self,name,sex,birthday,ident): ifnot(isinstance(name,str)andsexin("女","男")): raisePersonValueError(name,sex) #用于检查输入时的实参是否符合要求 try: birthday=datetime.date(*birthday) #*birthday表示其参数是一个可迭代的对象(元祖,列表等) #返回一个日期对象(year,month,day),这个date类的 #构造函数会检查输入年月日的合法性 except: raisePersonValueError("wrongdate:",birthday) self._name=name self._sex=sex self._birthday=birthday self._id=ident Person._num+=1 defid(self):returnself._id defname(self):returnself._name defsex(self):returnself._sex defbirthday(self):returnself._birthday defage(self):return(datetime.date.today().year-self._birthday.year) #用于获取一个单体的某个信息 #算出年龄(today方法的year属性用于给出今年) defset_name(self,name):#修改名字 ifnotisinstance(name,str): raisePersonValueError("set_name",name) self._name=name #用于修改名字 def__lt__(self,another): #当实例出现在小于号两边时会自动调用 #类似的有:__gt__:大于;__le__:小于等于;__ge__:大于等于; #__eq__:等于;__ne__:不等于 ifnotisinstance(another,Person): raisePersonTypeError(another) returnself._id以上实现了一个通用的人信息的类,接下来有学生和职工的类都是继承自这个基类。
接下来我们看学生类的实现:
提前讲一下,学生类有一个学号的自动生成函数,在类内自动调用生成学号
classStudent(Person): _id_num=0 #下面这个类方法可以说是很经典的使用,对于初学者来说,对于深入理解类有帮助 @classmethod **def_id_gen(cls): #自动生成学号的类内部函数(该函数只在类的内部调用) cls._id_num+=1 year=datetime.date.today().year return"1{:04}{:05}".format(year,cls._id_num) #后面的04,05代表是位数,不足前面补零** def__init__(self,name,sex,birthday,department): Person.__init__(self,name,sex,birthday,Student._id_gen()) #这里通过调用之前基类的初始化函数 #这里调用了之前定义的生成学号的类方法 self._department=department self._enroll_date=datetime.date.today() self._courses={}#实例属性用来记录该学生的课程以及成绩 defset_course(self,course_name): self._courses[course_name]=None #输入所有的课程 defset_score(self,course_name,score): ifcourse_namenotinself._courses: raisePersonValueError("Nothiscourseselected:", course_name) self._courses[course_name]=score #当然我们对于学生的档案里首先时学生要挑选好课程,然后才有分数 #首先判断课程在不在已选的课程表里,然后再是给他输入分数 defscores(self): return[(cname,self._courses[cname]) forcnameinself._courses] #将课程和分数用元祖的形式输出 defdetails(self): return",".join((Person.details(self), "入学日期:"+str(self._enroll_date), "院系:"+self._department, "课程记录:"+str(self.scores()))) #p1=Student("谢雨洁","女",(1995,7,30),"Physics") #p2=Student("汪力强","男",(1990,2,17),"Mathematics") #p3=Student("张子玉","女",(1974,10,14),"English") #p4=Student("李国栋","男",(1962,5,24),"Comp.Sci") # #print(p1.details()) #print(p1)#继承的基类Person的方法最后时职工类,职工类不像前面的学生类,可以直接调用基类的初始化函数,这里最好用super函数,进行基类方法的调用
classStaff(Person): _id_num=0 @classmethod def_id_gen(cls,birthday): cls._id_num+=1 birth_year=datetime.date(*birthday).year return"0{:04}{:05}".format(birth_year,cls._id_num) def__init__(self,name,sex,birthday,entry_date=None): super().__init__(name,sex,birthday,Staff._id_gen(birthday)) ifentry_date: try: self._entry_date=datetime.date(*entry_date) except: raisePersonValueError("Wrongdate:",entry_date) else: self._entry_date=datetime.date.today() self._salary=1720 self._department="未定" self._position="未定" defset_salary(self,amount): ifnottype(amount)isint: raiseTypeError self._salary=amount defset_position(self,position): self._position=position defset_department(self,department): self._department=department defdetails(self): return",".join((super().details(), "入职时间:"+str(self._entry_date), "院系:"+self._department, "职位:"+self._position, "工资:"+str(self._salary))) p1=Staff("张子玉","女",(1974,10,16)) p2=Staff("李国栋","男",(1962,5,24)) print(p1) print(p2) p1.set_department("数学") p1.set_position("副教授") p1.set_salary(8400) print(p1.details()) print(p2.details())代码参考《数据结构与算法python语言描述》
强推这本书,对于深入理解python很有帮助。
更多学习资料请关注专题《管理系统开发》。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。