Chapter 28 继承

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录


前言

在面向对象编程中,继承是一个重要的概念,它允许我们创建新的类(子类),以获得现有类(父类)的特性和行为。本文详细讲解了Python 中的继承特性,介绍了如何通过继承来有效地扩展和复用代码。


本篇文章参考:黑马程序员

一、基础语法

在Python中,继承(Inheritance)是一种面向对象编程(OOP)的特性,它允许一个类(子类或派生类)从另一个类(父类或基类)获取属性和方法。

①定义

从父类那里继承(复制)成员变量和成员方法(不含私有)

②类型

  • 单继承:一个类继承另一个类
  • 多继承:一个类继承多个类,按照顺序从左向右依次继承

③基本语法

class 类(父类1,父类2,......,父类N) :
  类内容体

【注意】

子类构建的类对象

  • 可拥有自己的成员变量和成员方法
  • 可使用父类的成员变量和成员方法

单继承:

python 复制代码
# 单继承
class Phone:
    IMEI=None   # 手机序列号
    producer="HA"   # 厂商

    def call_by_4g(self):
        print("4g通话")

class Phone2024(Phone):
    face_id="10001"   # 面部识别ID

    def call_by_5g(self):
        print("2024年新功能:5g通话")

phone=Phone2024()
print(phone.producer)
phone.call_by_4g()
phone.call_by_5g()

输出结果:

HA

4g通话

2024年新功能:5g通话

多继承:

python 复制代码
class Phone:
    IMEI=None   # 手机序列号
    producer="HA"   # 厂商

    def call_by_4g(self):
        print("4g通话")

class NFCReader:
    nfc_type="第五代"
    producer="BE"

    def read_card(self):
        print("NFC读卡")

    def write_card(self):
        print("NFC写卡")

class RemoteControl:
    rc_type="红外遥控"

    def control(self):
        print("红外遥控开启")

class MyPhone(Phone,NFCReader,RemoteControl):
    pass

phone=MyPhone()
phone.call_by_4g()
phone.read_card()
phone.write_card()
phone.control()
print(phone.producer)   # 输出为"HA",如果父类有同名的方法或属性,先继承的优先级高于后继承

输出结果:

4g通话

NFC读卡

NFC写卡

红外遥控开启

HA

【注意】

多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级,先继承的优先级高于后继承。

④pass关键字
定义:

在 Python 中,pass是一个特殊的关键字,表示无内容,空的意思。

作用:

  • 占位符:
    定义一个类或函数但暂时不想添加任何代码时,可使用 pass 来占位。
  • 保持结构完整:
    在 Python 中,类和函数的定义必须有内容。如果去掉pass而没有其他任何内容,则会引发IndentationError: expected an indented block语法错误。
python 复制代码
class Phone:
    IMEI=None   # 手机序列号
    producer="HA"   # 厂商

    def call_by_4g(self):
        print("4g通话")

class NFCReader:
    nfc_type="第五代"
    producer="BE"

    def read_card(self):
        print("NFC读卡")

    def write_card(self):
        print("NFC写卡")

class RemoteControl:
    rc_type="红外遥控"

    def control(self):
        print("红外遥控开启")

class MyPhone(Phone,NFCReader,RemoteControl):
    pass

【分析】

这段代码中MyPhone类继承了 Phone、NFCReader 和 RemoteControl 这三个父类,但没有添加任何额外的属性或方法。为了保持代码的完整性,这里使用 pass 作为占位符,确保了类的定义是合法的。

二、复写

子类继承父类的成员属性和方法后,如果对某些实现不满意,可以通过复写在子类中重新定义同名的属性或方法。

复写:在子类中重新定义父类的方法。

python 复制代码
# 定义父类
class Phone:
    IMEI=None   # 手机序列号
    producer="HA"   # 厂商

    def call_by_5g(self):
        print("使用5g进行通话")

# 定义子类,复写父类的成员
class MyPhone(Phone):
    # 复写父类的成员属性
    producer = "BE"

    # 复写父类的成员方法
    def call_by_5g(self):
        print("开启CPU单核模式,确保通话的时候省电")
        print("使用5g进行通话")
        print("关闭CPU单核模式,确保性能")

phone=MyPhone()
phone.call_by_5g()
print(phone.producer)

输出结果:

开启CPU单核模式,确保通话的时候省电

使用5g进行通话

关闭CPU单核模式,确保性能

BE

一旦在子类中复写了父类的成员,当类对象调用该成员时,将会调用复写后的新实现。如果需要访问被复写的父类成员,则需要使用特殊的调用方式。

方式一:直接通过父类的名称访问其成员

调用成员变量:父类名.成员变量
调用成员方法:父类名.成员方法(self)

【注意】

直接通过父类的名称访问其成员需要显式传递self,该方式适合简单的继承结构。

python 复制代码
# 定义父类
class Phone:
    IMEI=None   # 手机序列号
    producer="HA"   # 厂商

    def call_by_5g(self):
        print("使用5g进行通话")

# 定义子类,复写父类的成员
class MyPhone(Phone):
    # 复写父类的成员属性
    producer = "BE"

    # 复写父类的成员方法
    def call_by_5g(self):
        print("开启CPU单核模式,确保通话的时候省电")
        # 方式一:通过父类名直接调用它的成员
        print(f"父类的厂商是:{Phone.producer}")
        Phone.call_by_5g(self)
        print("关闭CPU单核模式,确保性能")

phone=MyPhone()
phone.call_by_5g()

输出结果:

开启CPU单核模式,确保通话的时候省电

父类的厂商是:HA

使用5g进行通话

关闭CPU单核模式,确保性能

方式二:使用super()方法访问父类的成员

调用成员变量:super().成员变量
调用成员方法:super().成员方法()

【注意】

使用super()时,无需显式传递self,因为super()在调用时会自动获取当前实例的上下文,该方式适合多重继承结构。

python 复制代码
# 定义父类
class Phone:
    IMEI=None   # 手机序列号
    producer="HA"   # 厂商

    def call_by_5g(self):
        print("使用5g进行通话")

# 定义子类,复写父类的成员
class MyPhone(Phone):
    # 复写父类的成员属性
    producer = "BE"

    # 复写父类的成员方法
    def call_by_5g(self):
        print("开启CPU单核模式,确保通话的时候省电")
        # 方式二:
        print(f"父类的厂商是:{super().producer}")
        super().call_by_5g()
        print("关闭CPU单核模式,确保性能")

phone=MyPhone()
phone.call_by_5g()

输出结果:

开启CPU单核模式,确保通话的时候省电

父类的厂商是:HA

使用5g进行通话

关闭CPU单核模式,确保性能

【注意】

只能在子类内部直接调用父类的同名成员,子类的实例对象默认调用的是子类中复写后的成员。

相关推荐
2601_962293791 小时前
OCRmyPDF批处理脚本:使用Python自动化复杂OCR任务
python·自动化·批处理脚本·ocrmypdf·ocr任务
Java后端的Ai之路2 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
2601_962077713 小时前
基于Python与NLP的新闻事件信息抽取实战:从NER到时空标准化
python·nlp·transformers·spacy·新闻事件抽取
JavaPub-rodert3 小时前
LangChain 从入门到 Agent 实战:用 Python 搭建一个真正能调用工具和知识库的 AI 助手
人工智能·python·langchain
郝学胜-神的一滴4 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
m0_380743875 小时前
给 OpenAI API 调用加上模型切换:GPT-5.1 和 Codex 的配置实践
人工智能·python·gpt
2601_962297485 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
“AI国潮设计-小江”5 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
公爵爱学习5 小时前
无人机视觉识别前序-Linux-YOLO安装
python·yolo·计算机视觉·conda·无人机
2601_962295335 小时前
使用python实现一个浏览器自动化的脚本
python·脚本·rpa·浏览器自动化·操作