继承
继承是代码的重用
- 子类中即实现父类的方法,又实现自己的方法:
- super().父类方法名(参数(自传self))
- 父类名.父类方法名(参数)
- 子类以及子类实例化的对象 可以访问父类的任何方法或变量.
class People(): def __init__(self, name, age): self.Name = name self.Age = age def eat(self): print('%s is eating...' % self.Name) def talk(self): print('%s is talking...' % self.Name) def sleep(self): print('%s is sleeping...' % self.Name) class Man(People): # 继承了People类,括号里面的 父类,基类,超类 括号外面的 子类,派生类. def sleep(self): # 有相同的方法时调用自己的 People.sleep(self) # 调用了People的sleep方法 super().sleep() # 新式类的写法 print('man is sleep...') m1 = Man('jack', 24) m1.eat() m1.sleep()
结果:
jack is eating... jack is sleeping... jack is sleeping... man is sleep...
例
# class People():#经典类 class People(object): # 新式类 def __init__(self, name, age): self.Name = name self.Age = age def eat(self): print('%s is eating...' % self.Name) def talk(self): print('%s is talking...' % self.Name) def sleep(self): print('%s is sleeping...' % self.Name) class Man(People): # 继承了People类 def __init__(self, name, age, money): # 必须将参数都写上 # People.__init__(self,name,age) # name和age用People的实例变量,经典类写法 super(Man, self).__init__(name, age) # name和age用People的实例变量,新式类写法 self.money = money print('%s have %s' % (self.Name, self.money)) def sleep(self): # 重构People类,有相同的方法时调用自己的 People.sleep(self) # 调用了People的方法 print('man is sleep...') class Woman(People): def birth(self): print('woman is birth...') m1 = Man('jack', 24, 88888) m1.eat() m1.sleep() m2 = Woman('bob', 22) m2.birth() m2.sleep()
结果:
jack have 88888 jack is eating... jack is sleeping... woman is birth... bob is sleeping...
多继承
class People(object): # 新式类 def __init__(self, name, age): self.name = name self.Age = age def eat(self): print('%s is eating...' % self.name) def talk(self): print('%s is talking...' % self.name) def sleep(self): print('%s is sleeping...' % self.name) class Friend(object): def make_friend(self, obj): # 这里的obj为后面实例化的值,底下将 m1 实例化后传给了 obj print("%s is with %s" %(self.name, obj.name)) # obj.name=jack class Man(People, Friend): # 继承了People类 def __init__(self, name, age, money): # 必须将参数都写上 # People.__init__(self,name,age) # name和age用People的实例变量,经典类写法 super(Man, self).__init__(name, age) # name和age用People的实例变量,新式类写法 self.money = money def sleep(self): # 重构People类,有相同的方法时调用自己的 People.sleep(self) # 调用了People的方法 print('man is sleep...') class Woman(People, Friend): def birth(self): print('woman is birth...') m1 = Man('jack', 24, 88888) print(m1) m2 = Woman('bob', 22) m2.make_friend(m1) # make_friend需要传一个值,将m1传给 make_friend
结果:
<__main__.Man object at 0x0320B430> bob is with jack
Friend不用初始化,因为先继承people,里面有name,age,如果people和Friend换位置,也没事,因为Friend没有执行
类名.mro()查看类的继承顺序
class A: def __init__(self): print("A") class B(A): pass # def __init__(self): # print("B") class C(A): # pass def __init__(self): print("C") class D(B, C): pass # def __init__(self): # print("D") obj = D()
结果:
C
py2经典类是按深度优先来继承的,新式类是按广度优先来继承的
py3经典类和新式类统一是按广度优先来继承的
class School(object): def __init__(self, name, addr): self.name = name self.addr = addr self.students = [] # 定义了列表,放学生 self.staffs = [] # 定义了列表,放老师 def enroll(self, stu_obj): # 学生注册 print('为学员%s 办理注册手续' % stu_obj.name) self.students.append(stu_obj) # 将学生加到列表里 def hire(self, staff_obj): # 雇佣老师,staff_obj实例化,这里是Teacher类 print('雇佣新员工%s' % staff_obj.name) # staff_obj.name是Teacher里的name self.staffs.append(staff_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) self.stu_id = stu_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 $%s' % (self.name, amount)) school = School('高科', '西安') # 实例化了School类 t1 = Teacher('lfj', 32, 'm', 3000, 'python') # 实例化了Teacher类 t2 = Teacher('zouzou', 22, 'm', 30000, 'linuxDevops') # 实例化了Teacher类 s1 = Student('jack', 36, 'mm', 1001, 'python') # 实例化了Student类 s2 = Student('bob', 30, 'mm', 1002, 'linuxDevops') # 实例化了 Student类 t1.tell() s1.tell() school.hire(t1) # 将t1传给hire school.enroll(s1) # 将实例化了的Student类school下的enroll school.enroll(s2) print(school.students) # 打印出学生的内存地址 print(school.staffs) # 打印出老师的内存地址 school.staffs[0].teach() # 调用了Teacher下的teach for stu in school.students: stu.pay_tuition(5000) # 调用了students下的pay_tuition
结果:
-------info of Teacher:lfj------- Name:lfj Age:32 Sex:m Salary:3000 Course:python -------info of Student:jack------- Name:jack Age:36 Sex:mm Stu_id:1001 Grade:python 雇佣新员工lfj 为学员jack 办理注册手续 为学员bob 办理注册手续 [<__main__.Student object at 0x02C9B790>, <__main__.Student object at 0x02C9B7B0>] [<__main__.Teacher object at 0x02C9B750>] lfj is teaching course [python] jack has paid tution $5000 bob has paid tution $5000