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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。