欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!
文章目录
- 前言
- 一、基础语法
- 二、复写
前言
在面向对象编程中,继承是一个重要的概念,它允许我们创建新的类(子类),以获得现有类(父类)的特性和行为。本文详细讲解了Python 中的继承特性,介绍了如何通过继承来有效地扩展和复用代码。
本篇文章参考:黑马程序员
一、基础语法
在Python中,继承(Inheritance)是一种面向对象编程(OOP)的特性,它允许一个类(子类或派生类)从另一个类(父类或基类)获取属性和方法。
①定义
从父类那里继承(复制)成员变量和成员方法(不含私有)
②类型
- 单继承:一个类继承另一个类
- 多继承:一个类继承多个类,按照顺序从左向右依次继承
③基本语法
class 类(父类1,父类2,……,父类N) :
类内容体
【注意】
子类构建的类对象
- 可拥有自己的成员变量和成员方法
- 可使用父类的成员变量和成员方法
单继承:
# 单继承
class Phone:IMEI=None # 手机序列号producer="HA" # 厂商def call_by_4g(self):print("4g通话")class Phone2024(Phone):face_id="10001" # 面部识别IDdef call_by_5g(self):print("2024年新功能:5g通话")phone=Phone2024()
print(phone.producer)
phone.call_by_4g()
phone.call_by_5g()
输出结果:
HA
4g通话
2024年新功能:5g通话
多继承:
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):passphone=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
语法错误。
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 作为占位符,确保了类的定义是合法的。
二、复写
子类继承父类的成员属性和方法后,如果对某些实现不满意,可以通过复写在子类中重新定义同名的属性或方法。
复写:在子类中重新定义父类的方法。
# 定义父类
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
,该方式适合简单的继承结构。
# 定义父类
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()
在调用时会自动获取当前实例的上下文,该方式适合多重继承结构。
# 定义父类
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单核模式,确保性能
【注意】
只能在子类内部直接调用父类的同名成员,子类的实例对象默认调用的是子类中复写后的成员。