python實(shí)現(xiàn)大學(xué)人員管理系統(tǒng)
python作為一個(gè)面對(duì)對(duì)象的程序設(shè)計(jì)語(yǔ)言,實(shí)現(xiàn)一個(gè)人員管理系統(tǒng)有自己關(guān)于類的方法。
首先,通過(guò)定義一個(gè)人員的類對(duì)象,實(shí)現(xiàn)對(duì)于人員公共特性的支持,公共的特性包括:姓名,性別,出生日期等,用一個(gè)Person類來(lái)表示。大學(xué)里總的來(lái)說(shuō)分為兩種身份的人:學(xué)生(Student)和職工(Staff),這兩種有自己的特性,比如學(xué)生信息就有學(xué)號(hào),課程,成績(jī)等;職工有職工號(hào),職位,薪水等。
利用python類對(duì)象的繼承機(jī)制我們就可以很方便的表示這兩種身份的人。
我們首先定義一個(gè)Person類,這個(gè)類用于保存共有的特性
import datetime
class PersonValueError(ValueError):
pass
class PersonTypeError(TypeError):
pass
class Person:
_num = 0
# 類屬性,這個(gè)屬性在類內(nèi)使用(_X)屬性一般默認(rèn)只能在類內(nèi)使用
def __init__(self, name, sex, birthday, ident):
if not (isinstance(name, str) and sex in ("女", "男")):
raise PersonValueError(name, sex)
# 用于檢查輸入時(shí)的實(shí)參是否符合要求
try:
birthday = datetime.date(*birthday)
# *birthday表示其參數(shù)是一個(gè)可迭代的對(duì)象(元祖,列表等)
# 返回一個(gè)日期對(duì)象(year,month,day),這個(gè)date類的
# 構(gòu)造函數(shù)會(huì)檢查輸入年月日的合法性
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)
# 用于獲取一個(gè)單體的某個(gè)信息
# 算出年齡(today方法的year屬性用于給出今年)
def set_name(self, name): # 修改名字
if not isinstance(name, str):
raise PersonValueError("set_name", name)
self._name = name
# 用于修改名字
def __lt__(self, another):
# 當(dāng)實(shí)例出現(xiàn)在小于號(hào)兩邊時(shí)會(huì)自動(dòng)調(diào)用
# 類似的有:__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)))
# 運(yùn)算重載符:當(dāng)實(shí)例出現(xiàn)在print函數(shù)中時(shí),自動(dòng)調(diào)用這個(gè)方法
def details(self):
return ", ".join(("編號(hào):" + str(self._id),
"姓名:" + self._name,
"性別:" + self._sex,
"出生日期:" + str(self._birthday)))
#
# p1 = Person("謝雨潔", "女", (1995, 7, 30), 1201510111)
# p2 = Person("汪力強(qiáng)", "男", (1990, 2, 17), 1201380324)
# p3 = Person("張子玉", "女", (1974, 10, 14), 3331747032)
# p4 = Person("李國(guó)棟", "男", (1962, 5, 24), 1293848593)
#
# plist = [p1, p2, p3, p4]
# for p in plist:
# print(p)
# # 這里就會(huì)直接調(diào)用實(shí)例方法__str__
#
# print("\nAfter sorting:")
# plist.sort()
# # 這里就調(diào)用的運(yùn)算重載符__lt__(很重要的一個(gè)知識(shí)點(diǎn),如何通過(guò)實(shí)例方法實(shí)現(xiàn)對(duì)類多個(gè)實(shí)例進(jìn)行排序)
# for p in plist:
# print(p.details())
#
# print("people created:", Person.num(), "\n")
以上實(shí)現(xiàn)了一個(gè)通用的人信息的類,接下來(lái)有學(xué)生和職工的類都是繼承自這個(gè)基類。
接下來(lái)我們看學(xué)生類的實(shí)現(xiàn):
提前講一下,學(xué)生類有一個(gè)學(xué)號(hào)的自動(dòng)生成函數(shù),在類內(nèi)自動(dòng)調(diào)用生成學(xué)號(hào)
class Student(Person):
_id_num = 0
# 下面這個(gè)類方法可以說(shuō)是很經(jīng)典的使用,對(duì)于初學(xué)者來(lái)說(shuō),對(duì)于深入理解類有幫助
@classmethod
**def _id_gen(cls):
# 自動(dòng)生成學(xué)號(hào)的類內(nèi)部函數(shù)(該函數(shù)只在類的內(nèi)部調(diào)用)
cls._id_num += 1
year = datetime.date.today().year
return "1{:04}{:05}".format(year, cls._id_num)
# 后面的04, 05代表是位數(shù),不足前面補(bǔ)零**
def __init__(self, name, sex, birthday, department):
Person.__init__(self, name, sex, birthday, Student._id_gen())
# 這里通過(guò)調(diào)用之前基類的初始化函數(shù)
# 這里調(diào)用了之前定義的生成學(xué)號(hào)的類方法
self._department = department
self._enroll_date = datetime.date.today()
self._courses = {} #實(shí)例屬性用來(lái)記錄該學(xué)生的課程以及成績(jī)
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
# 當(dāng)然我們對(duì)于學(xué)生的檔案里首先時(shí)學(xué)生要挑選好課程,然后才有分?jǐn)?shù)
# 首先判斷課程在不在已選的課程表里,然后再是給他輸入分?jǐn)?shù)
def scores(self):
return [(cname, self._courses[cname])
for cname in self._courses]
# 將課程和分?jǐn)?shù)用元祖的形式輸出
def details(self):
return ", ".join((Person.details(self),
"入學(xué)日期:" + str(self._enroll_date),
"院系:" + self._department,
"課程記錄:" + str(self.scores())))
# p1 = Student("謝雨潔", "女", (1995, 7, 30), "Physics")
# p2 = Student("汪力強(qiáng)", "男", (1990, 2, 17), "Mathematics")
# p3 = Student("張子玉", "女", (1974, 10, 14), "English")
# p4 = Student("李國(guó)棟", "男", (1962, 5, 24), "Comp.Sci")
#
# print(p1.details())
# print(p1) # 繼承的基類Person的方法
最后時(shí)職工類,職工類不像前面的學(xué)生類,可以直接調(diào)用基類的初始化函數(shù),這里最好用super函數(shù),進(jìn)行基類方法的調(diào)用
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(),
"入職時(shí)間:" + str(self._entry_date),
"院系:" + self._department,
"職位:" + self._position,
"工資:" + str(self._salary)))
p1 = Staff("張子玉", "女", (1974, 10, 16))
p2 = Staff("李國(guó)棟", "男", (1962, 5, 24))
print(p1)
print(p2)
p1.set_department("數(shù)學(xué)")
p1.set_position("副教授")
p1.set_salary(8400)
print(p1.details())
print(p2.details())
代碼參考《數(shù)據(jù)結(jié)構(gòu)與算法 python語(yǔ)言描述》
強(qiáng)推這本書,對(duì)于深入理解python很有幫助。
更多學(xué)習(xí)資料請(qǐng)關(guān)注專題《管理系統(tǒng)開發(fā)》。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java關(guān)于string最常出現(xiàn)的面試題整理
在本篇文章里小編給大家整理的是一篇關(guān)于java關(guān)于string最常出現(xiàn)的面試題整理內(nèi)容,有興趣的朋友們可以參考下。2021-01-01
用python做一個(gè)搜索引擎(Pylucene)的實(shí)例代碼
下面小編就為大家?guī)?lái)一篇用python做一個(gè)搜索引擎(Pylucene)的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
Python?selenium把歌詞評(píng)論做成詞云圖
大家好,本篇文章主要講的是Python?selenium把歌詞評(píng)論做成詞云圖,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01

