python--继承

网友投稿 248 2022-08-25


python--继承

继承

继承是代码的重用

子类中即实现父类的方法,又实现自己的方法: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

# 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 88888jack is eating...jack is sleeping...woman is birth...bob is

多继承

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=jackclass 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

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): passclass 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传给hireschool.enroll(s1) # 将实例化了的Student类school下的enrollschool.enroll(s2)print(school.students) # 打印出学生的内存地址print(school.staffs) # 打印出老师的内存地址school.staffs[0].teach() # 调用了Teacher下的teachfor stu in school.students: stu.pay_tuition(5000) # 调用了students下的pay_tuition

结果:

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 $5000bob has paid tution $5000


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java使用Socket实现文件上传功能
下一篇:python--封装(python封装py文件)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~