目录
一、为什么需要继承
1、一个小问题,还是看程序,提出代码复用问题
1)我们编写两个类,一个是Pupil类(小学生),一个是Graduate(大学毕业生)
2)问题:两个类的属性和方法有很多是相同的,怎么办?
# 没有使用继承前的代码
# 小学生类
class Pupil:
name=None
age=None
__score=None
def __init__(self,name,age):
self.name=name
self.age=age
def show_info(self):
print(f"name={self.name} age={self.age} score={self.__score}")
def set_score(self,score):
self.__score=score
def testing(self):
print("小学生在考小学数学...")
# 大学生类
class Graduate:
name = None
age = None
__score = None
def __init__(self, name, age):
self.name = name
self.age = age
def show_info(self):
print(f"name={self.name} age={self.age} score={self.__score}")
def set_score(self, score):
self.__score = score
def testing(self):
print("大学生在考高等数学...")
# 测试
student1=Pupil("apple",10)
student1.testing()
student1.set_score(70)
student1.show_info()
print("-------------")
student2=Graduate("grape",20)
student2.testing()
student2.set_score(80)
student2.show_info()
2、问题分析
1)Pupil和Graduate有很多相同的属性和方法
2)目前这样的做法,代码复用性差,同时也不利于代码的维护和管理
二、继承的基本介绍
1、继承的基本介绍
1)继承可以解决代码复用,让我们的编程更加靠近人类的思维
2)当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有子类不需要重新定义这些属性和方法
2、继承示意图
3、继承的基本语法
class 子类名(父类名):
.........
.........
1)派生类就会自动拥有基类定义的属性和方法
2)基类习惯上也叫父类
3)派生类习惯上也叫子类
三、快速入门
# 使用继承代码
class Student:
name = None
age = None
__score = None
def __init__(self, name, age):
self.name = name
self.age = age
def show_info(self):
print(f"name={self.name} age={self.age} score={self.__score}")
def set_score(self, score):
self.__score = score
# 小学生类
class Pupil(Student):
def testing(self):
print("小学生在考小学数学...")
# 大学生类
class Graduate(Student):
def testing(self):
print("大学生在考高等数学...")
# 测试
student1=Pupil("apple",10)
student1.testing()
student1.set_score(70)
student1.show_info()
print("-------------")
student2=Graduate("grape",20)
student2.testing()
student2.set_score(80)
student2.show_info()
继承给编程带来的便利
1)代码的复用性提高了
2)代码的扩展性和维护性提高了
四、继承的使用细节
1、子类继承了父类所有的属性和方法,非私有属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
class Base:
# 公共属性
n1=100
# 私有属性
__n2=200
def __init__(self):
print("Base构造方法...")
def hi(self):
print("hi()公共方法")
def __hello(self):
print("__hello()私有方法")
class Sub(Base):
def __init__(self):
print("Sub构造方法...")
def say_ok(self):
# 父类的非私有属性和方法可以访问
print("say_ok()",self.n1)
self.hi()
# 父类的私有属性和方法不可以访问
# print(self.n2)
# self.__hello()
sub=Sub()
sub.say_ok()
2、Python编程语言中,"object"是所有其它类的基类,通过ctrl+H可以查看类的继承关系
3、Python支持多重继承
class 子类(父类1,父类2,父类3....):
...........
...........
# 多重继承
class A:
n1=100
def sing(self):
print("A sing()...",self.n1)
class B:
n2=200
def dance(self):
print("B dance()...",self.n2)
class C(A,B):
# Python中,pass是空语句,是为了保持程序结构的完整性
# pass 不做任意事情,一般是做占位语句
pass
c=C()
print(f"属性信息:{c.n1} {c.n2} ")
c.sing()
c.dance()
4、在多重继承中,如果有同名的成员,遵循从左到右的继承优先级(即:左边的父类优先级高,右边的父类优先级低)
五、练习
编写Computer类,包含CPU、内存、硬盘等属性
1)get_details方法用于返回Computer的详细信息
2)编写PC子类,继承Computer类,添加特有属性(品牌brand)
3)完成测试,创建PC对象,给对象中的特有属性赋值,以及从Computer类继承的属性赋值,并使用方法打印输出信息
"""
思路分析:
1、父类:Computer
2、公共属性:CPU(cpu)、内存(memory)、硬盘(disk)
3、构造方法:__init__(self,cpu,memory,disk)
4、方法:get_details(self)
5、子类:PC(Computer)
6、特有属性:brand
7、构造方法:__init__(self,cpu,memory,disk,brand)
8、方法:print_info(self)完成功能:输出pc对象的信息(即属性信息)
"""
class Computer:
cpu=None
memory=None
disk=None
def __init__(self,cpu,memory,disk):
self.cpu=cpu
self.memory=memory
self.disk=disk
def get_details(self):
return f"cpu:{self.cpu}\t内存:{self.memory}\t硬盘:{self.disk}"
class PC(Computer):
brand=None
"""
解读:
1、通过super().xx方式可以去调用父类的方法
2、super.__init__(cpu,memory,disk)调用父类方构造器,完成对父类属性的初始化
3、self.brand=brand表示子类特有属性,由子类的构造器完成初始化
"""
def __init__(self,cpu,memory,disk,brand):
super().__init__(cpu,memory,disk)
self.brand=brand
def print_info(self):
# 完成打印当前对象的信息
print(f"品牌:{self.brand}\t{self.get_details()}")
# 测试
pc=PC("intel",32,1000,"戴尔")
pc.print_info()