python實(shí)現(xiàn)大學(xué)人員管理系統(tǒng)
python作為一個(gè)面對(duì)對(duì)象的程序設(shè)計(jì)語言,實(shí)現(xiàn)一個(gè)人員管理系統(tǒng)有自己關(guān)于類的方法。
首先,通過定義一個(gè)人員的類對(duì)象,實(shí)現(xiàn)對(duì)于人員公共特性的支持,公共的特性包括:姓名,性別,出生日期等,用一個(gè)Person類來表示。大學(xué)里總的來說分為兩種身份的人:學(xué)生(Student)和職工(Staff),這兩種有自己的特性,比如學(xué)生信息就有學(xué)號(hào),課程,成績等;職工有職工號(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("李國棟", "男", (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),如何通過實(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è)通用的人信息的類,接下來有學(xué)生和職工的類都是繼承自這個(gè)基類。
接下來我們看學(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è)類方法可以說是很經(jīng)典的使用,對(duì)于初學(xué)者來說,對(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()) # 這里通過調(diào)用之前基類的初始化函數(shù) # 這里調(diào)用了之前定義的生成學(xué)號(hào)的類方法 self._department = department self._enroll_date = datetime.date.today() self._courses = {} #實(shí)例屬性用來記錄該學(xué)生的課程以及成績 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("李國棟", "男", (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("李國棟", "男", (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語言描述》
強(qiáng)推這本書,對(duì)于深入理解python很有幫助。
更多學(xué)習(xí)資料請(qǐng)關(guān)注專題《管理系統(tǒng)開發(fā)》。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python中count統(tǒng)計(jì)指定字符、元素出現(xiàn)次數(shù)的實(shí)現(xiàn)
本文主要介紹了Python中count統(tǒng)計(jì)指定字符、元素出現(xiàn)次數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07關(guān)于jupyter代碼自動(dòng)補(bǔ)全設(shè)置方式
這篇文章主要介紹了關(guān)于jupyter代碼自動(dòng)補(bǔ)全設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06詳解python uiautomator2 watcher的使用方法
這篇文章主要介紹了python uiautomator2 watcher的使用方法,該方是基于uiautomator2如下版本進(jìn)行驗(yàn)證,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-09-09Django實(shí)現(xiàn)一對(duì)多表模型的跨表查詢方法
今天小編就為大家分享一篇Django實(shí)現(xiàn)一對(duì)多表模型的跨表查詢方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python3enumrate和range對(duì)比及示例詳解
這篇文章主要介紹了Python3enumrate和range對(duì)比及示例詳解,在Python中,enumrate和range都常用于for循環(huán)中,enumrate函數(shù)用于同時(shí)循環(huán)列表和元素,而range()函數(shù)可以生成數(shù)值范圍變化的列表,而能夠用于for循環(huán)即都是可迭代的,需要的朋友可以參考下2019-07-07Ubuntu下使用Python實(shí)現(xiàn)游戲制作中的切分圖片功能
這篇文章主要介紹了Ubuntu下使用Python實(shí)現(xiàn)游戲制作中的切分圖片功能,涉及Python針對(duì)圖片的讀取、載入、切分運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Python數(shù)學(xué)建模StatsModels統(tǒng)計(jì)回歸可視化示例詳解
圖形總是比數(shù)據(jù)更加醒目、直觀。解決統(tǒng)計(jì)回歸問題,無論在分析問題的過程中,還是在結(jié)果的呈現(xiàn)和發(fā)表時(shí),都需要可視化工具的幫助和支持2021-10-10