面向对象编程-继承

目录

一、为什么需要继承

二、继承的基本介绍

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()
相关推荐
好看资源平台1 小时前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
进击的六角龙1 小时前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂1 小时前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc1 小时前
Python简介以及解释器安装(保姆级教学)
开发语言·python
孤独且没人爱的纸鹤1 小时前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
羊小猪~~2 小时前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j
lzhlizihang2 小时前
python如何使用spark操作hive
hive·python·spark
q0_0p2 小时前
牛客小白月赛105 (Python题解) A~E
python·牛客
极客代码2 小时前
【Python TensorFlow】进阶指南(续篇三)
开发语言·人工智能·python·深度学习·tensorflow
庞传奇2 小时前
TensorFlow 的基本概念和使用场景
人工智能·python·tensorflow