DDR爱好者之家 Design By 杰米
python作为一个面对对象的程序设计语言,实现一个人员管理系统有自己关于类的方法。
首先,通过定义一个人员的类对象,实现对于人员公共特性的支持,公共的特性包括:姓名,性别,出生日期等,用一个Person类来表示。大学里总的来说分为两种身份的人:学生(Student)和职工(Staff),这两种有自己的特性,比如学生信息就有学号,课程,成绩等;职工有职工号,职位,薪水等。
利用python类对象的继承机制我们就可以很方便的表示这两种身份的人。
我们首先定义一个Person类,这个类用于保存共有的特性
import datetime class PersonValueError(ValueError): pass class PersonTypeError(TypeError): pass class Person: _num = 0 # 类属性,这个属性在类内使用(_X)属性一般默认只能在类内使用 def __init__(self, name, sex, birthday, ident): if not (isinstance(name, str) and sex in ("女", "男")): raise PersonValueError(name, sex) # 用于检查输入时的实参是否符合要求 try: birthday = datetime.date(*birthday) # *birthday表示其参数是一个可迭代的对象(元祖,列表等) # 返回一个日期对象(year,month,day),这个date类的 # 构造函数会检查输入年月日的合法性 except: raise PersonValueError("wrong date:", birthday) self._name = name self._sex = sex self._birthday = birthday self._id = ident Person._num += 1 def id(self):return self._id def name(self):return self._name def sex(self):return self._sex def birthday(self):return self._birthday def age(self): return (datetime.date.today().year - self._birthday.year) # 用于获取一个单体的某个信息 # 算出年龄(today方法的year属性用于给出今年) def set_name(self, name): # 修改名字 if not isinstance(name, str): raise PersonValueError("set_name", name) self._name = name # 用于修改名字 def __lt__(self, another): # 当实例出现在小于号两边时会自动调用 # 类似的有:__gt__: 大于; __le__:小于等于; __ge__: 大于等于; # __eq__: 等于; __ne__: 不等于 if not isinstance(another, Person): raise PersonTypeError(another) return self._id < self._id # 用于之后的排序使用 @classmethod def num(cls): return Person._num def __str__(self): return " ".join((str(self._id), self._name, self._sex, str(self._birthday))) # 运算重载符:当实例出现在print函数中时,自动调用这个方法 def details(self): return ", ".join(("编号:" + str(self._id), "姓名:" + self._name, "性别:" + self._sex, "出生日期:" + str(self._birthday))) # # p1 = Person("谢雨洁", "女", (1995, 7, 30), 1201510111) # p2 = Person("汪力强", "男", (1990, 2, 17), 1201380324) # p3 = Person("张子玉", "女", (1974, 10, 14), 3331747032) # p4 = Person("李国栋", "男", (1962, 5, 24), 1293848593) # # plist = [p1, p2, p3, p4] # for p in plist: # print(p) # # 这里就会直接调用实例方法__str__ # # print("\nAfter sorting:") # plist.sort() # # 这里就调用的运算重载符__lt__(很重要的一个知识点,如何通过实例方法实现对类多个实例进行排序) # for p in plist: # print(p.details()) # # print("people created:", Person.num(), "\n")
以上实现了一个通用的人信息的类,接下来有学生和职工的类都是继承自这个基类。
接下来我们看学生类的实现:
提前讲一下,学生类有一个学号的自动生成函数,在类内自动调用生成学号
class Student(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 = {} #实例属性用来记录该学生的课程以及成绩 def set_course(self, course_name): self._courses[course_name] = None # 输入所有的课程 def set_score(self, course_name, score): if course_name not in self._courses: raise PersonValueError("No this course selected:", course_name) self._courses[course_name] = score # 当然我们对于学生的档案里首先时学生要挑选好课程,然后才有分数 # 首先判断课程在不在已选的课程表里,然后再是给他输入分数 def scores(self): return [(cname, self._courses[cname]) for cname in self._courses] # 将课程和分数用元祖的形式输出 def details(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函数,进行基类方法的调用
class Staff(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)) if entry_date: try: self._entry_date = datetime.date(*entry_date) except: raise PersonValueError("Wrong date:", entry_date) else: self._entry_date = datetime.date.today() self._salary = 1720 self._department = "未定" self._position = "未定" def set_salary(self, amount): if not type(amount) is int: raise TypeError self._salary = amount def set_position(self, position): self._position = position def set_department(self, department): self._department = department def details(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很有帮助。
更多学习资料请关注专题《管理系统开发》。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米
暂无评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
2024年11月26日
2024年11月26日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]