面向对象编程语言具有封装、继承、多态三个基本特征,本文就继承举例详谈
比如说学校
主要有3大角色:
学校,讲师,学员
学校可以注册学员,统计有多少学员
老师负责讲课
学生听课,提问,学习,交学费
先定义4个类:
class School(object): #学校
def __init__(self):
pass
class SchoolMember(object): #学校成员
def __init__(self):
pass
class Teacher(SchoolMember): #讲师
def __init__(self):
pass
class Student(SchoolMember): #学生
def __init__(self):
pass
再写几个类方法
class School(object): #学校
def __init__(self):
pass
def enroll(self): #注册
pass
class SchoolMember(object): #学校成员
def __init__(self):
pass
def tell(self): #打印自己个人信息
pass
class Teacher(SchoolMember): #讲师
def __init__(self):
pass
def tell(self): #重构父类方法,打印自己个人信息
pass
def teach(self): #讲课
pass
class Student(SchoolMember): #学生
def __init__(self):
pass
def tell(self):
pass
def pay_tuition(self,amount): #交学费
pass
完善类方法
class School(object): #学校
def __init__(self,name,addr):
self.name = name #姓名
self.addr = addr #地址
self.students = [] #学生列表
self.teachers = [] #讲师列表
def enroll(self,stu_obj): #注册
print('为学员%s 办理注册手续'% stu_obj)
self.students.append(stu_obj)
class SchoolMember(object): #学校成员
def __init__(self,name,age,sex):
self.name = name #姓名
self.age = age #年龄
self.sex = sex #性别
def tell(self): #打印自己个人信息
pass
class Teacher(SchoolMember): #讲师
def __init__(self,name,age,sex,salary,course):
super(Teacher,self).__init__(name,age,sex) #引用父类的name,age,sex
self.salary = salary #工资
self.course = course #课程
def tell(self): #重构父类方法,打印自己个人信息
print('''
--- info of Teacher:%s ---
Name:%s
Age:%s
Sex:%s
Salary:%s
Course:%s
''' % (self.name,self.name,self.age,self.sex,self.salary,self.course))
def teach(self): #讲课
print("%s is teaching course [%s]" % (self.name,self.course))
class Student(SchoolMember): #学生
def __init__(self,name,age,sex,stu_id,grade):
super(Student,self).__init__(name,age,sex) #引用父类的name,age,sex
self.stu_id = stu_id #学生id
self.grade = grade #班级
def tell(self):
print('''
--- info of Student:%s ---
Name:%s
Age:%s
Sex:%s
Stu_id:%s
Grade:%s
''' % (self.name,self.name,self.age,self.sex,self.stu_id,self.grade))
def pay_tuition(self,amount): #交学费
print("%s has paid tution for $%s" % (self.name,amount))
实例化对象
school = School("老男孩IT","沙河") #实例化学校
t1 = Teacher("Oldboy",56,"M",2000000,"Linux") #实例化一个老师
t2 = Teacher("Alex",22,"M",3000,"PythonDevOps")
s1 = Student("ChenRonghua",36,"M",1001,"PythonDevOps") #实例化一个学生
s2 = Student("Xuliangwei",19,"M",1002,"Linux")
执行类方法
t1.tell() #打印老师个人信息
s1.tell() #打印学生个人信息
执行输出:
--- info of Teacher:Oldboy ---
Name:Oldboy
Age:56
Sex:M
Salary:2000000
Course:Linux
--- info of Student:ChenRonghua ---
Name:ChenRonghua
Age:36
Sex:M
Stu_id:1001
Grade:PythonDevOps
雇佣一个老师,注册一个学生,完整代码如下:
#!/usr/bin/env python
# coding: utf-8
__author__ = 'www.py3study.com'
class School(object): #学校
def __init__(self,name,addr):
self.name = name #姓名
self.addr = addr #地址
self.students = [] #学生列表
self.stalls = [] #员工列表
def enroll(self,stu_obj): #注册
print('为学员%s 办理注册手续'% stu_obj.name)
self.students.append(stu_obj)
def hire(self,stall_obj): #雇用老师
self.stalls.append(stall_obj) #添加员工
print('雇佣新员工 %s' % stall_obj.name)
class SchoolMember(object): #学校成员
def __init__(self,name,age,sex):
self.name = name #姓名
self.age = age #年龄
self.sex = sex #性别
def tell(self): #打印自己个人信息
pass
class Teacher(SchoolMember): #讲师
def __init__(self,name,age,sex,salary,course):
super(Teacher,self).__init__(name,age,sex) #引用父类的name,age,sex
self.salary = salary #工资
self.course = course #课程
def tell(self): #重构父类方法,打印自己个人信息
print('''
--- info of Teacher:%s ---
Name:%s
Age:%s
Sex:%s
Salary:%s
Course:%s
''' % (self.name,self.name,self.age,self.sex,self.salary,self.course))
def teach(self): #讲课
print("%s is teaching course [%s]" % (self.name,self.course))
class Student(SchoolMember): #学生
def __init__(self,name,age,sex,stu_id,grade):
super(Student,self).__init__(name,age,sex) #引用父类的name,age,sex
self.stu_id = stu_id #学生id
self.grade = grade #班级
def tell(self):
print('''
--- info of Student:%s ---
Name:%s
Age:%s
Sex:%s
Stu_id:%s
Grade:%s
''' % (self.name,self.name,self.age,self.sex,self.stu_id,self.grade))
def pay_tuition(self,amount): #交学费
print("%s has paid tution for $%s" % (self.name,amount))
school = School("老男孩IT","沙河") #实例化学校
t1 = Teacher("Oldboy",56,"M",2000000,"Linux") #实例化一个老师
t2 = Teacher("Alex",22,"M",3000,"PythonDevOps")
s1 = Student("ChenRonghua",36,"M",1001,"PythonDevOps") #实例化一个学生
s2 = Student("Xuliangwei",19,"M",1002,"Linux")
t1.tell() #打印老师个人信息
s1.tell() #打印学生个人信息
school.hire(t1) #雇佣一个老师
school.enroll(s1) #注册一个学生
执行输出:
--- info of Teacher:Oldboy ---
Name:Oldboy
Age:56
Sex:M
Salary:2000000
Course:Linux
--- info of Student:ChenRonghua ---
Name:ChenRonghua
Age:36
Sex:M
Stu_id:1001
Grade:PythonDevOps
雇佣新员工 Oldboy
为学员ChenRonghua 办理注册手续
打印2个列表
print(school.students) #学生列表
print(school.stalls) #员工列表
执行输出:
[<__main__.Student object at 0x000001C7018BD390>]
[<__main__.Teacher object at 0x000001C7018BD320>]
这是2个对象
再注册一个学生,让第一个老师去讲课,最后一行添加
school.enroll(s2) #注册第二个学生
school.stalls[0].teach() #让第一个老师去讲课
执行输出:
Oldboy is teaching course [Linux]
让每个学生都交学费,最后一行添加
for stu in school.students:
stu.pay_tuition(5000)
执行输出:
ChenRonghua has paid tution for $5000
Xuliangwei has paid tution for $5000
在这个例子中,SchoolMember和Teacher、Student是继承关系
Teacher、Student和School是组合关系,通过某种方式,组合在一起了。
他们之间产生了一些交互
这个例子不难,只要把逻辑理清就可以了。