面向对象编程-继承

目录

一、为什么需要继承

二、继承的基本介绍

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()
相关推荐
进击的六角龙43 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
Aniay_ivy1 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
gonghw4031 小时前
DearPyGui学习
python·gui
向阳12181 小时前
Bert快速入门
人工智能·python·自然语言处理·bert
engchina1 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
兆。1 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
南宫理的日知录2 小时前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
coberup2 小时前
django Forbidden (403)错误解决方法
python·django·403错误
龙哥说跨境3 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫