Python基础教学之四:面向对象编程——迈向更高级编程

Python基础教学之四:面向对象编程——迈向更高级编程

一、面向对象编程概念

1. 类和对象

  • 定义:在面向对象编程(OOP)中,类是创建对象的模板,它定义了对象的属性和方法。对象是类的实例,具体存在的实体,拥有状态和行为。
  • 关系:类与对象的关系类似于蓝图与房屋的关系。类描述了对象应具有的属性和能够执行的方法,而对象则是这些属性和方法的具体实现。
  • 作用域:类中定义的属性和方法统称为类的成员。这些成员有不同的访问级别,如公开、私有等,决定了它们是否可以被类外部的代码直接访问。
  • 方法:类中的方法代表对象的可执行行为。特殊方法(如__init__)有特定的功能,普通方法则执行对象的行为。
  • 属性:属性是对象的状态,可以是变量或可调用的对象。在类中,可以定义实例属性和类属性,分别属于对象和类本身。
  • self:在类的方法中,第一个参数通常是self,指代调用该方法的对象本身。通过self可以访问对象的属性和其他方法。

2. 继承

  • 概念:继承是OOP的一个核心机制,允许新的类从现有的类继承属性和方法,促进代码重用和逻辑清晰。
  • 父类与子类:在继承关系中,被继承的类称为父类(基类),继承其他类的类称为子类(派生类)。子类继承了父类的特征并可以扩展或覆盖它们。
  • 重写与扩展:子类可以重写继承的方法,以修改或扩展其功能。也可以通过super()函数调用父类的方法,在此基础上添加额外的逻辑。
  • 多层继承:Python支持多层继承,即一个类可以继承多个父类。这增加了灵活性,但也增加了复杂性。
  • 接口继承与实现继承:在接口继承中,子类只继承方法的签名而不包括实现,实现继承则是子类继承方法的具体实现。
  • 菱形继承问题:当子类从多个父类继承时,可能出现祖父类的方法被调用多次的问题,这需要通过合适的继承结构来解决。
  • 抽象类与接口:抽象类和接口是特殊的类,它们定义了一组方法,但本身不提供实现。子类必须实现这些方法才能成为具体的类。

3. 封装

  • 原理:封装是将数据和操作数据的方法组织在一起的过程,隐藏内部实现细节,只暴露必要的接口给外部。
  • 作用:封装减少了类和模块之间的依赖,提高了代码的可读性和易维护性。
  • 访问控制:Python没有严格的访问控制机制,但通过命名约定(如使用下划线前缀)来标识私有成员,限制直接访问。
  • getter和setter:使用getter和setter方法来读取和修改属性值,可以在方法中加入逻辑验证,保证数据的有效性和完整性。Getter and Setter in Python - GeeksforGeeks
  • 描述符:描述符是一种特殊的对象,可以实现属性的getter和setter功能,用于高级属性访问控制。
  • 属性注解:Python允许使用注解来标记属性的类型,虽然这不直接影响封装,但有助于代码的文档化和类型检查。
  • 模块化:封装促进了代码模块化,使得各个模块和类的职责单一,专注于完成特定任务,减少耦合。

二、类的创建和使用

1. 定义类

  • 使用class关键字定义类,后跟类名和冒号。
  • 类定义中包括属性和方法。
  • class ClassName:<statement-1>...<statement-N>

2. 实例化对象

  • 使用类名后跟括号来创建类的实例(对象)。
  • 对象可访问类中定义的属性和方法。
  • #!/usr/bin/python3class Complex:def __init__(self, realpart, imagpart):self.r = realpartself.i = imagpart
    x = Complex(3.0, -4.5)
    print(x.r, x.i)   # 输出结果:3.0 -4.5

3. 构造方法__init__

  • __init__方法用于初始化新创建的对象。
  • 当创建对象时自动调用,可设置初始属性值。

三、继承和多态

1. 继承的实现

  • 通过在类定义时指定父类来实现继承。
  • 子类可以继承父类的属性和方法。
class DerivedClassName(BaseClassName):<statement-1>...<statement-N>

2. 多态的概念

        多态是面向对象编程中一个重要的概念,它描述了一个函数或方法能够对不同类型参数进行操作的能力。这种能力使得程序更加灵活和可扩展,因为它允许相同的接口可以用于不同的数据类型。

  • 多态指不同对象对同一方法的不同实现。
  • 子类可以覆盖或扩展父类的方法。

3. 重写方法

  • 在子类中重新定义父类的方法,以改变其行为。
  • 使用super()函数调用父类的方法。
#!/usr/bin/python3class Parent:        # 定义父类def myMethod(self):print ('调用父类方法')class Child(Parent): # 定义子类def myMethod(self):print ('调用子类方法')c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法

四、实战演示:设计面向对象程序

1. 模拟现实世界问题

  • 以设计一个图书馆管理系统为例,展示如何抽象出类和对象。
  • 创建BookMemberLibrarian等类。

2. 利用OOP特性解决问题

  • 使用继承创建NovelTextbook类,它们都继承自Book类。
  • 实现多态,如不同类型的书籍有不同的借阅规则。

3. 设计用户界面

  • 演示如何为图书馆系统设计简单的文本界面。
  • 通过创建LibrarySystem类,管理图书和会员的交互。
class LibrarySystem:def __init__(self):self.books = {}  # key: book_id, value: book_titleself.members = {}  # key: member_id, value: member_nameself.borrowed_books = {}  # key: member_id, value: list of borrowed book_idsdef add_book(self, book_id, book_title):if book_id in self.books:print(f"Book '{book_title}' with ID {book_id} already exists.")else:self.books[book_id] = book_titleprint(f"Book '{book_title}' has been added with ID {book_id}.")def register_member(self, member_id, member_name):if member_id in self.members:print(f"Member '{member_name}' with ID {member_id} already registered.")else:self.members[member_id] = member_nameself.borrowed_books[member_id] = []print(f"Member '{member_name}' has been registered with ID {member_id}.")def borrow_book(self, member_id, book_id):if book_id not in self.books:print(f"Book with ID {book_id} does not exist.")elif member_id not in self.members:print(f"Member with ID {member_id} is not registered.")elif book_id in self.borrowed_books[member_id]:print(f"Member '{self.members[member_id]}' has already borrowed the book '{self.books[book_id]}' with ID {book_id}.")else:self.borrowed_books[member_id].append(book_id)print(f"Member '{self.members[member_id]}' has borrowed the book '{self.books[book_id]}' with ID {book_id}.")def return_book(self, member_id, book_id):if book_id not in self.books:print(f"Book with ID {book_id} does not exist.")elif member_id not in self.members:print(f"Member with ID {member_id} is not registered.")elif book_id not in self.borrowed_books[member_id]:print(f"Member '{self.members[member_id]}' did not borrow the book '{self.books[book_id]}' with ID {book_id}.")else:self.borrowed_books[member_id].remove(book_id)print(f"Member '{self.members[member_id]}' has returned the book '{self.books[book_id]}' with ID {book_id}.")def run(self):while True:print("\nWelcome to the Library System")print("1. Add a book")print("2. Register a member")print("3. Borrow a book")print("4. Return a book")print("5. Exit")choice = input("Enter your choice: ")if choice == "1":book_id = input("Enter book ID: ")book_title = input("Enter book title: ")self.add_book(book_id, book_title)elif choice == "2":member_id = input("Enter member ID: ")member_name = input("Enter member name: ")self.register_member(member_id, member_name)elif choice == "3":member_id = input("Enter member ID: ")book_id = input("Enter book ID: ")self.borrow_book(member_id, book_id)elif choice == "4":member_id = input("Enter member ID: ")book_id = input("Enter book ID: ")self.return_book(member_id, book_id)elif choice == "5":print("Exiting the Library System.")breakelse:print("Invalid choice. Please enter a number between 1 and 5.")# Create an instance of LibrarySystem and run it
library_system = LibrarySystem()
library_system.run()

五、总结

        至此,我们深入探讨了Python中的面向对象编程,学习了类和对象、继承、封装和多态等核心概念。通过实际案例,我们了解了如何运用这些概念解决实际问题,并体验了编程的另一种范式。继续前进,我们将探索Python的异常处理和文件操作,使程序更加健壮和实用。

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

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

相关文章

【JavaScript 报错】未捕获的范围错误:Uncaught RangeError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 递归调用次数过多2. 数组长度超出限制3. 数值超出允许范围 二、解决方案1. 限制递归深度2. 控制数组长度3. 检查数值范围 三、实例讲解四、总结 Uncaught RangeError 是JavaScript中常见的一种错误&…

347. 前 K 个高频元素(中等)

347. 前 K 个高频元素 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;347. 前 K 个高频元素 2.详细题解 寻找出现频率前 k k k高的元素&#xff0c;因此需要先统计各个元素出现的次数&#xff0c;该步骤时间复杂度为 O ( n ) O(n) O(n)…

C++模板总结

文章目录 写在前面1. 函数模板1.1 函数模板的概念1.2 函数模板的原理1.3 函数模板的实例化1.4 函数模板的实例化模板参数的匹配原则 2. 类模板3. 非类型模板参数4. 模板的特化4.1 概念4.2 函数模板特化4.3 类模板特化 5. 模板分离编译6. 总结 写在前面 进入C以后&#xff0c;C…

智能小车——初步想法

需要参考轮趣的智能小车自己搭建一台智能机器人&#xff0c;这里从底层控制开始逐步搭建。 控制模式 之后要自行搭建智能小车&#xff0c;所以将轮趣的底盘代码进行学习&#xff0c;根据开发手册先大致过一遍需要的内容。 有做很多个控制方法&#xff0c;包括了手柄、串口、…

Linux下常见压缩文件tar.xz、tar.bz2、tar.gz的区别和详解

文章目录 tar.xz tar.bz2 tar.gz 的区别三种文件的解压方式tar.xz的解压三种压缩文件的创建方式 tar.xz tar.bz2 tar.gz 的区别 这三个文件扩展名都表示压缩后的档案文件&#xff0c;但它们使用不同的压缩算法。 tar.xz: tar 代表 Tape Archive&#xff0c;它是一种将多个文件…

【若依管理系统】注意事项

1.前端字段必填 rules: {sceneName: [{ required: true, message: "场景名称不能为空", trigger: "blur" }],orderNum: [{ required: true, message: "显示排序不能为空", trigger: "blur" }], }, 2.IDEA&#xff0c;默认以debug模式…

Agents 要点

一、Agents概念 人类是这个星球上最强大的 Agent。Agent是一个能感知并自主地采取行动的实体&#xff0c;这里的自主性极其关键&#xff0c;Agent要能够实现设定的目标&#xff0c;其中包括具备学习和获取知识的能力以提高自身性能。 关键点&#xff1a;感知环境、自主决策、具…

element plus 实现跨页面+跨tab栏多选

文章目录 element plus 层面数据层面 菜鸟好久没写博客了&#xff0c;主要是没遇见什么很难的问题&#xff0c;今天碰见了一个没有思路的问题&#xff0c;解决后立马来和大家伙分享了&#xff01; 菜鸟今天要实现一个需求&#xff0c;就是&#xff1a;实现跨页面跨 tab栏 多选…

CVE-2024-27292:Docassemble任意文件读取漏洞复现 [附POC]

文章目录 CVE-2024-27292&#xff1a;Docassemble任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 CVE-2024-27292&#xff1a;Docassemble任意文件读取漏洞复现 [附POC] 0x01 前言 …

冒泡排序与其C语言通用连续类型排序代码

冒泡排序与其C语言通用连续类型排序代码 冒泡排序冒泡排序为交换排序的一种&#xff1a;动图展示&#xff1a;冒泡排序的特性总结&#xff1a;冒泡排序排整型数据参考代码&#xff08;VS2022C语言环境&#xff09;&#xff1a; 冒泡排序C语言通用连续类型排序代码对比较的方式更…

法律行业守护神:知识库+AI大模型,解锁企业知识全周期管理

在法律行业中&#xff0c;搭建一个有效的知识库并进行企业知识全生命周期管理确实是一项不小的挑战。法律环境的复杂性和不断变化的法规要求企业必须持续更新和维护其知识库&#xff0c;以确保所有信息的准确性和实时性。 这种系统化的信息管理不仅有助于提高律师和法律顾问的…

打卡第9天-----字符串

我在自学的时候,看了卡尔的算法公开课了,有些题目我就照葫芦画瓢写了一遍js代码,差不多都写出来了,有暴力解法,有卡尔推荐的思路和方法。话不多说,直接上题上代码吧: 一、翻转字符串里的单词 leetcode题目链接:151. 反转字符串中的单词 题目描述: 给你一个字符串 s…

5个自动化面试题,助你过关斩将!

面试时&#xff0c;自动化是软件测试高频面试内容&#xff0c;通过学习和准备面试题&#xff0c;你会对可能遇到的问题有所准备&#xff0c;从而减轻面试时的紧张感&#xff0c;让你在面试中稳操胜券&#xff01; 今天&#xff0c;分享一些在面试中可能会遇到的自动化测试面试…

大学生暑假“三下乡”社会实践工作新闻投稿指南请查收!

近年来&#xff0c;大学生暑期“三下乡”社会实践工作方兴未艾&#xff0c;越来越多的大学生通过参与“三下乡”实践工作&#xff0c;走出校园&#xff0c;深入基层&#xff0c;体验农村生活&#xff0c;服务农民&#xff0c;促进农村经济社会发展&#xff0c;实现了理论与实践…

算能科技,致力于成为全球领先的通用算力供应商

算能致力于成为全球领先的定制算力提供商&#xff0c;专注于RISC-V、TPU处理器等算力产品的研发和推广应用。公司遵循全面开源开放的生态理念&#xff0c;携手行业伙伴推动RISC-V高性能通用计算产业落地&#xff1b;打造覆盖“云、边、端”的全场景产品矩阵&#xff0c;为数据中…

【eNSP模拟实验】三层交换机实现VLAN通信

实验需求 让PC1和PC2能够互相通讯&#xff0c;其中PC1在vlan10中&#xff0c;PC2在vlan20中。 实验操作 首先把PC1和PC2都配置好ip&#xff0c;配置好之后&#xff0c;点击右下角的应用 然后&#xff0c;在S2交换机&#xff08;S3700&#xff09;上做如下配置 #进入系统 <…

【Redis】Redis十大类型

文章目录 前言一、string字符串类型二、List列表类型三、 Hash表四、 Set集合五、 ZSet有序集合六、 GEO地理空间七、 HyperLogLog基数统计八、Bitmap位图九、bitfield位域十、 Stream流10.1 队列指令10.2 消费组指令10.3 ACK机制 前言 redis是k-v键值对进行存储&#xff0c;k…

【最经典的79个】软件测试面试题(内含答案)提前备战“金九银十”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

“论软件维护方法及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后&#xff0c;直至软件被淘汰的整个时间范围内&#xff0c;为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中&#xff0c;软件需要维护的原因是多种多样的&#xff0c; 根据维护的原因不同&#xff0c;可以将软件维护…

CVE-2024-34351 漏洞复现

CVE-2024-34351&#xff0c;由Next.js异步函数createRedirectRenderResult导致的SSRF。 影响版本&#xff1a;13.4.0< Next.js < 14.1.1 参考文章&#xff1a; Next.js Server-Side Request Forgery in Server Actions CVE-2024-34351 GitHub Advisory Database Gi…