Python 继承、多态、封装、抽象

面向对象编程(OOP)是 Python 中的一种重要编程范式,它通过类和对象来组织代码。OOP 的四个核心概念是继承(Inheritance)、多态(Polymorphism)、封装(Encapsulation)和数据抽象(Data Abstraction)。下面将详细介绍这四个概念。

继承(Inheritance)

继承是面向对象编程(OOP)的一个基本概念,它允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法。继承促进了代码的重用,并有助于在类之间建立层次结构。在 Python 中,可以通过继承现有的基类来创建新的派生类。

继承的类型

1. 单继承(Single Inheritance)
  • 派生类从单个基类继承。

示例

class Animal:def __init__(self, name):self.name = namedef speak(self):passclass Dog(Animal):def speak(self):return f"{self.name} says Woof!"dog = Dog("Buddy")
print(dog.speak())  # 输出: Buddy says Woof!
2. 多继承(Multiple Inheritance)
  • 派生类从多个基类继承。

示例

class Animal:def __init__(self, name):self.name = nameclass Canine:def bark(self):return "Woof!"class Dog(Animal, Canine):def speak(self):return f"{self.name} says {self.bark()}"dog = Dog("Buddy")
print(dog.speak())  # 输出: Buddy says Woof!
3. 多级继承(Multilevel Inheritance)
  • 派生类从另一个派生类继承。

示例

class Animal:def __init__(self, name):self.name = nameclass Mammal(Animal):def __init__(self, name, has_fur):super().__init__(name)self.has_fur = has_furclass Dog(Mammal):def speak(self):return f"{self.name} says Woof!"dog = Dog("Buddy", True)
print(dog.speak())  # 输出: Buddy says Woof!
4. 层次继承(Hierarchical Inheritance)
  • 多个派生类从单个基类继承。

示例

class Animal:def __init__(self, name):self.name = nameclass Dog(Animal):def speak(self):return f"{self.name} says Woof!"class Cat(Animal):def speak(self):return f"{self.name} says Meow!"dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak())  # 输出: Buddy says Woof!
print(cat.speak())  # 输出: Whiskers says Meow!
5. 混合继承(Hybrid Inheritance)
  • 两种或多种继承类型的组合。通常涉及层次继承、多级继承和多继承的混合。

示例

class Animal:def __init__(self, name):self.name = nameclass Canine(Animal):def bark(self):return "Woof!"class Feline(Animal):def meow(self):return "Meow!"class Dog(Canine):def speak(self):return f"{self.name} says {self.bark()}"class Cat(Feline):def speak(self):return f"{self.name} says {self.meow()}"dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak())  # 输出: Buddy says Woof!
print(cat.speak())  # 输出: Whiskers says Meow!

详细解释

  1. 单继承

    • 最简单的继承形式,派生类从单个基类继承。
    • 适用于简单的类层次结构。
  2. 多继承

    • 派生类可以从多个基类继承。
    • 适用于需要从多个来源继承功能的场景。
    • 使用 super() 方法可以避免多重继承中的方法冲突。
  3. 多级继承

    • 派生类从另一个派生类继承,形成多级层次结构。
    • 适用于需要逐步细化功能的场景。
  4. 层次继承

    • 多个派生类从单个基类继承。
    • 适用于需要多个子类共享同一基类功能的场景。
  5. 混合继承

    • 两种或多种继承类型的组合。
    • 适用于复杂的类层次结构,需要灵活地组合多种继承方式。

注意事项

  • 方法解析顺序(MRO)

    • 在多继承中,Python 使用 C3 线性化算法来确定方法解析顺序(MRO)。
    • 可以使用 mro() 方法查看类的 MRO。
    • 例如:
      print(Dog.mro())
      
  • 使用 super()

    • super() 函数用于调用父类的方法,特别是在多继承中避免方法冲突。
    • 例如:
      class Mammal(Animal):def __init__(self, name, has_fur):super().__init__(name)self.has_fur = has_fur
      

多态(Polymorphism)

多态是面向对象编程(OOP)的一个核心概念,它允许不同类的对象被视为单一超类的成员。多态通过单一接口表示多种底层形式(数据类型),使得不同类可以提供同名但根据对象类具有不同行为的方法。多态通过方法重载和方法重写实现,促进了代码的灵活性和集成,使得编写通用、可重用的代码变得更加容易。

多态的基本概念

  1. 方法重写(Method Overriding)

    • 子类可以重写父类的方法,以提供不同的实现。
    • 通过方法重写,可以在子类中扩展或修改父类的行为。
  2. 方法重载(Method Overloading)

    • 同一个类中可以定义多个同名但参数不同的方法。
    • Python 本身不直接支持方法重载,但可以通过默认参数和可变参数等技术实现类似的效果。

示例

以下是一个展示多态的 Python 示例:

class Animal:def speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"def make_animal_speak(animal):print(animal.speak())dog = Dog()
cat = Cat()make_animal_speak(dog)  # 输出: Woof!
make_animal_speak(cat)  # 输出: Meow!

封装(Encapsulation)

封装是面向对象编程(OOP)的一个核心概念,它将方法(函数)和数据(属性)组织成一个类单元。封装还防止未经授权访问对象的某些部分,从而保护数据不被误用和无意干扰。通常,这是通过使用前导下划线或双下划线将某些属性或方法设为私有来实现的。封装通过公共方法提供受控访问,鼓励模块化并帮助维护对象数据的完整性。

封装的基本概念

  1. 私有属性和方法

    • 使用单个前导下划线 _ 表示“受保护”(protected)属性或方法,通常不应在类外部直接访问。
    • 使用双前导下划线 __ 表示“私有”(private)属性或方法,Python 会对其进行名称改写(name mangling),使其更难以在类外部访问。
  2. 公共方法

    • 提供公共方法来访问和修改私有属性,确保数据的完整性和安全性。

示例

以下是一个展示 Python 封装的示例:

class BankAccount:def __init__(self, owner, balance):self.owner = ownerself.__balance = balance  # 私有属性def deposit(self, amount):if amount > 0:self.__balance += amountprint(f"Deposited {amount}. New balance: {self.__balance}")else:print("Deposit amount must be positive.")def withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountprint(f"Withdrew {amount}. New balance: {self.__balance}")else:print("Invalid withdrawal amount.")def get_balance(self):return self.__balance# 创建 BankAccount 类的对象
account = BankAccount("Alice", 1000)# 调用公共方法
account.deposit(500)  # 输出: Deposited 500. New balance: 1500
account.withdraw(200)  # 输出: Withdrew 200. New balance: 1300# 尝试直接访问私有属性(不推荐)
# print(account.__balance)  # 这将引发 AttributeError# 通过公共方法访问私有属性
print(account.get_balance())  # 输出: 1300

数据抽象(Data Abstraction)

数据抽象是面向对象编程(OOP)的一个重要原则,其目的是隐藏系统的复杂实现细节,只向用户展示必要和相关的信息。数据抽象通过提供简单和直观的接口,有助于提高效率和减少复杂性。它使程序员能够处理简化的系统表示,并管理复杂的操作。在 Python 中,可以使用抽象基类(Abstract Base Classes, ABC)和接口来实现数据抽象。

抽象基类(Abstract Base Classes, ABC)

抽象基类是定义了一组抽象方法的类,这些方法必须由派生类实现。抽象方法是没有具体实现的方法,只有方法签名。通过使用抽象基类,可以确保所有派生类都实现特定的方法,从而保证标准化和一致的交互。

示例

以下是一个使用抽象基类实现数据抽象的 Python 示例:

from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):pass@abstractmethoddef perimeter(self):passclass Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width + self.height)class Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2def perimeter(self):return 2 * 3.14 * self.radius# 创建 Rectangle 和 Circle 对象
rect = Rectangle(10, 20)
circ = Circle(15)# 访问 area 和 perimeter 方法
print(f"Rectangle Area: {rect.area()}")       # 输出: Rectangle Area: 200
print(f"Rectangle Perimeter: {rect.perimeter()}")  # 输出: Rectangle Perimeter: 60
print(f"Circle Area: {circ.area()}")          # 输出: Circle Area: 706.5
print(f"Circle Perimeter: {circ.perimeter()}")     # 输出: Circle Perimeter: 94.2

详细解释

  1. 定义抽象基类 Shape

    • Shape 类继承自 ABC 类,并定义了两个抽象方法 areaperimeter
    • 抽象方法使用 @abstractmethod 装饰器声明,表示这些方法必须在派生类中实现。
  2. 定义具体类 RectangleCircle

    • Rectangle 类继承自 Shape 类,并实现了 areaperimeter 方法。
    • Circle 类继承自 Shape 类,并实现了 areaperimeter 方法。
  3. 创建对象并调用方法

    • 创建 RectangleCircle 对象。
    • 调用 areaperimeter 方法,计算并输出矩形和圆形的面积和周长。

数据抽象的好处

  1. 隐藏复杂性

    • 通过抽象基类,可以隐藏具体的实现细节,只向用户提供必要的接口。
    • 例如,用户不必了解如何计算矩形和圆形的面积和周长,只需调用相应的方法即可。
  2. 标准化接口

    • 抽象基类确保所有派生类都实现特定的方法,从而提供标准化的接口。
    • 例如,所有形状类都必须实现 areaperimeter 方法,这使得处理不同形状的代码更加一致和简洁。
  3. 提高可维护性

    • 通过数据抽象,代码更加模块化,易于维护和扩展。
    • 例如,如果需要添加新的形状类(如 Triangle),只需实现 areaperimeter 方法,而无需修改现有代码。
  4. 简化交互

    • 用户可以使用相同的接口与不同类型的对象进行交互,而不必了解每个对象的具体实现。
    • 例如,可以编写一个通用函数来处理任何 Shape 对象,而无需关心它是 Rectangle 还是 Circle

总结

面向对象编程的核心概念

  • 继承(Inheritance):允许一个类(子类)继承另一个类(父类)的属性和方法。
  • 多态(Polymorphism):允许不同类的对象被视为单一超类的成员,通过方法重写和重载实现。
  • 封装(Encapsulation):将数据和操作数据的方法绑定在一起,通过私有属性和公共方法保护数据。
  • 数据抽象(Data Abstraction):隐藏系统的复杂实现细节,只向用户展示必要和相关的信息,通过抽象基类和接口实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464730.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTMLCSS:打造酷炫下载安装模拟按钮

效果演示 这段代码通过HTML和CSS创建了一个具有交互效果的下载按钮&#xff0c;当复选框被选中时&#xff0c;会触发一系列动画和样式变化&#xff0c;模拟了一个下载和安装的过程&#xff0c;包括圆形的动画、文本的显示和隐藏等。 HTML <div class"container&quo…

【C++、数据结构】哈希表——散列表(一)(概念/总结)

「前言」 &#x1f308;个人主页&#xff1a; 代码探秘者 &#x1f308;C语言专栏&#xff1a;C语言 &#x1f308;C专栏&#xff1a; C / STL使用以及模拟实现 &#x1f308;数据结构专栏&#xff1a; 数据结构 / 十大排序算法 &#x1f308;Linux专栏&#xff1a; Linux系统编…

WindowsDocker安装到D盘,C盘太占用空间了。

Windows安装 Docker Desktop的时候,默认位置是安装在C盘,使用Docker下载的镜像文件也是保存在C盘,如果对Docker使用评率比较高的小伙伴,可能C盘空间,会被耗尽,有没有一种办法可以将Docker安装到其它磁盘,同时Docker的数据文件也保存在其他磁盘呢? 答案是有的,我们可以…

mac|安装redis及RedisDesk可视化软件

一、安装 通过Homebrew安装 brew install redis 在安装过程可以得到以下信息&#xff1a; 1、启动redis或重新登陆redis brew services start redis 如果只想在前端运行&#xff0c;而不是在后端&#xff0c;则使用以下命令 /opt/homebrew/opt/redis/bin/redis-server /opt…

程序中怎样用最简单方法实现写excel文档

很多开发语言都能找到excel文档读写的库&#xff0c;但是在资源极其受限的环境下开发&#xff0c;引入这些库会带来兼容性问题。因为一个小功能引入一堆库&#xff0c;我始终觉得划不来。看到有项目引用的jar包有一百多个&#xff0c;看着头麻&#xff0c;根本搞不清谁依赖谁。…

重读《人月神话》(12)-未雨绸缪(Plan to Throw One Away)

对程序员而言&#xff0c;一个不容忽视的事实是&#xff1a;任何系统都将经历变更&#xff0c;最初精心设计的软件也可能因不断的修补而变得面目全非。无论设计多么完美&#xff0c;随着时间推移&#xff0c;系统难免陷入混乱&#xff0c;只是程度和速度有所不同。因此&#xf…

(附项目源码)python开发语言,基于python Web的高校毕业论文管理系统 51,计算机毕设程序开发+文案(LW+PPT)

摘 要 随着信息化技术的迅速发展&#xff0c;人类信息化文明的到来&#xff0c;为人类的日常生活以及日常生产活动提供了非常大的便利&#xff0c;有效地解决了很多曾经无法解决的问题。本次基于python Web的高校毕业论文管理系统的开发是针对我国传统的高校毕业论文管理模式沟…

计算机网络:网络层 —— 网络地址转换 NAT

文章目录 网络地址转换 NAT 概述最基本的 NAT 方法NAT 转换表的作用 网络地址与端口号转换 NAPTNAT 和 NAPT 的缺陷 网络地址转换 NAT 概述 尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度&#xff0c;但由于因特网用户数量的急剧增长&#xff0c;特别是大量小…

C++进阶:unordered_map和unordered_set的使用

目录 一.unordered_set系列 1.1unordered_set类的介绍 1.2unordered_set与set的差异 二.unordered_map的系列 三.unordered_multimap/unordered_multiset 一.unordered_set系列 1.1unordered_set类的介绍 • unordered_set的声明如下&#xff0c;Key就是unordered_set底层…

【6G 需求与定义】ITU(国际电联)对全球6G标准的愿景

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

java:题目:用Java实现简单的自取取款操作

import java.util.Scanner; public class ATM {public static void main(String[] args){//自主取款主类Scanner scnew Scanner(System.in);System.out.println("请输入账户号码&#xff1a;");String BankAccoutsrsc.nextLine();/BankAccout3 newBankAccoutnew Bank…

Windows 部署非安装版Redis

1.下载Redis https://github.com/microsoftarchive/redis/releases 选择下载zip包&#xff0c;如Redis-x64-3.0.504.zip&#xff0c;并解压 2.启动非安装版redis服务 进入到redis目录&#xff0c;打开cmd 执行命令 redis-server.exe redis.windows.conf 3.登录redis客户端…

【连续多届检索,ACM出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024,11月15-17)--冬季主会场

第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024)--冬季主会场 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 会议官网&#xff1a;www.icbar.net 2024 4th International Conference on Big Data, Artificial I…

HTML 基础概念:什么是 HTML ? HTML 的构成 与 HTML 基本文档结构

文章目录 什么是 HTML &#xff1f;HTML 的构成 &#xff1f;什么是 HTML 元素&#xff1f;HTML 元素的组成部分HTML 元素的特点 HTML 基本文档结构如何打开新建的 HTML 文件代码查看 什么是 HTML &#xff1f; HTML&#xff08;超文本标记语言&#xff0c;HyperText Markup L…

网络编程 TCP编程 Linux环境 C语言实现

所有基于数据传输通信的程序&#xff0c;都会被分成两种角色&#xff1a; 1. 服务端&#xff1a;又称为服务器 server 提供一种通信服务的进程 基本工作过程是&#xff1a;1> 接收请求数据 2> 处理请求数据 3> 发送处理结果 2. 客户端&#xff1a;client 使用一种通…

第二十九章 Vue之插槽

目录 一、引言 二、默认插槽 2.1. 默认插槽基本语法 2.2. 完整代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. MyDialog.vue 2.3. 运行效果 三、插槽后备内容&#xff08;默认值&#xff09; 3.1. 插槽后备内容基本语法 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vu…

宠物领养救助管理软件有哪些功能 佳易王宠物领养救助管理系统使用操作教程

一、概述 佳易王宠物领养救助管理系统V16.0&#xff0c;集宠物信息登记、查询&#xff0c;宠物领养登记、查询&#xff0c; 宠物领养预约管理、货品进出库库存管理于一体的综合管理系统软件。 概述&#xff1a; 佳易王宠物领养救助管理系统V16.0&#xff0c;集宠物信息登记…

【ESP32+MicroPython】开发环境部署

本教程将指导你如何在Visual Studio Code&#xff08;VSCode&#xff09;中设置ESP32的MicroPython开发环境。我们将涵盖从安装Python到烧录MicroPython固件的整个过程&#xff0c;以及如何配置VSCode以便与ESP32进行交互。 准备工作 安装Python 确保你的计算机上安装了Pyth…

前端Nginx的安装与应用

目录 一、前端跨域方式 1.1、CORS(跨域资源共享) 1.2、JSONP(已过时) 1.3、WebSocket 1.4、PostMessage 1.5、Nginx 二、安装 三、应用 四、命令 4.1、基本操作命令 4.2、nginx.conf介绍 4.2.1、location模块 4.2.2、反向代理配置 4.2.3、负载均衡模块 4.2.4、通…