面向对象编程-继承

目录

一、为什么需要继承

二、继承的基本介绍

1、继承的基本介绍

2、继承示意图

3、继承的基本语法

三、快速入门

四、继承的使用细节

五、练习


一、为什么需要继承

1、一个小问题,还是看程序,提出代码复用问题

1)我们编写两个类,一个是Pupil类(小学生),一个是Graduate(大学毕业生)

2)问题:两个类的属性和方法有很多是相同的,怎么办?

python 复制代码
# 没有使用继承前的代码

# 小学生类
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)派生类习惯上也叫子类

三、快速入门

python 复制代码
# 使用继承代码
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、子类继承了父类所有的属性和方法,非私有属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问

python 复制代码
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....):

...........

...........

python 复制代码
# 多重继承
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类继承的属性赋值,并使用方法打印输出信息

python 复制代码
"""
    思路分析:
    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()
相关推荐
FreakStudio1 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy
redcocal2 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
artificiali2 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python
RaidenQ3 小时前
2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘
图像处理·python·算法·课程设计
花生了什么树~.3 小时前
python基础知识(六)--字典遍历、公共运算符、公共方法、函数、变量分类、参数分类、拆包、引用
开发语言·python
Trouvaille ~3 小时前
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
图像处理·python·机器学习·numpy·信号处理·时间序列分析·科学计算
爆更小小刘3 小时前
Python基础语法(3)下
开发语言·python
哪 吒3 小时前
华为OD机试 - 第 K 个字母在原来字符串的索引(Python/JS/C/C++ 2024 E卷 100分)
javascript·python·华为od
憨憨小白4 小时前
Python 的集合类型
开发语言·python·青少年编程·少儿编程
白杆杆红伞伞4 小时前
01_快速入门
python·pandas