代碼上傳至github
此代碼已上傳至github,喜歡的給個star噢。嘻嘻~~
python3.6版本
Person.py
import datetime
class Person:
AllCount = 0
def __init__(self,number,name,sex,birthday):
self.number = number
self.name = name
self.birthday = birthday
self.sex = sex
Person.AllCount += 1
@property
def age(self):
return datetime.date.today().year - self.birthday.year
@age.setter
def age(self,value):
return AttributeError("禁止賦值年齡")
@age.deleter
def age(self):
return AttributeError("年齡不能刪除")
def __repr__(self):
return "<個人:{} at 0x{}>".format(self.number,id(self))
def __str__(self):
return "編號:{},姓名:{},性別:{}".format(self.number,self.name,self.sex)
def __del__(self):
Person.AllCount -= 1
Department.py
class Department:
def __init__(self,depnumber,adminstrate,louceng):
self.depnumber = depnumber
self.adminstrate = adminstrate
self.louceng = louceng
def __str__(self):
return "編號:{},管理者:{},樓層:{}".format(self.depnumber,self.adminstrate,self.louceng)
Teacher.py
from OO.Person import Person as Person
from OO.Department import Department as Department
class Teacher(Person):
TeacherCount = 0
def __init__(self, number,name,sex,birthday,depatment:Department, salay):
super().__init__(number,name,sex,birthday)
self.depatment = depatment
self.salay = salay
Teacher.TeacherCount += 1
def give_raise(self, percent, bonus=.0):
self.salay = self.salay * (1 + percent) + bonus
def __del__(self):
Teacher.TeacherCount -= 1
def __str__(self):
return "編號:{},姓名:{},性別:{},部門:{}".format(self.number, self.name, self.sex,self.depatment)
Student.py
from OO.Person import Person as p
class Student(p):
StudentCount = 0
def __init__(self,number,name,sex,birthday,grade):
super().__init__(number,name,sex,birthday)
#Person.__init__(self,number,name,sex,birthday) 或者可以這樣寫
self.grade = grade
Student.StudentCount += 1
def __del__(self):
Student.StudentCount -= 1
def __str__(self):
return "編號:{},姓名:{},性別:{}".format(self.number,self.name,self.sex)
main.py
import datetime
#注意包的導入格式
from OO.Person import Person as Person
from OO.Teacher import Teacher as Teacher
from OO.Student import Student as Student
from OO.Department import Department as Department
if __name__ == '__main__':
per = Person ("1","wu","女",datetime.date(1995,5,10))
dep = Department("x","wi",6)
tea = Teacher("1","wu","女",datetime.date(1995,5,10),dep,5000)
stu = Student("a","li","男",datetime.date(1998,2,15),90)
stu2 = Student("b", "Zhou", "女", datetime.date(1998, 2, 19), 80) #必須是stu2,stu 是佔原來的位置,使得stu.StudentCount不會加1
#感受下兩者區別,因爲age使用了裝飾器property且 @age.deleter進行修飾,所以age不能刪除。同時爲age的修改的函數也進行了修飾
# del (per.age)
# del (per.sex)
# print(per.age)
# print(per.sex)
#
#
# print(per) #調用Person.py裏的__str()__函數
# #腳本中直接寫 per 調用__repr__(self)函數
# print(tea.depatment.depnumber) #獲取教師所在的部門編號
print(per.AllCount)
print(tea.TeacherCount)
print(stu.StudentCount)
其中
super() 函數是用於調用父類(超類)的一個方法。
super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重複調用(鑽石繼承)等種種問題。