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/python3
     
    class Complex:
        def __init__(self, realpart, imagpart):
            self.r = realpart
            self.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/python3
 
class 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_title
        self.members = {}  # key: member_id, value: member_name
        self.borrowed_books = {}  # key: member_id, value: list of borrowed book_ids

    def 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_title
            print(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_name
            self.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.")
                break
            else:
                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的异常处理和文件操作,使程序更加健壮和实用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0到1开发一个Vue3的新手引导组件(附带遇到的问题以及解决方式)

1. 前言: 新手引导组件,顾名思义,就是强制性的要求第一次使用的用户跟随引导使用应用,可以让一些第一次使用系统的新手快速上手,正好我最近也遇到了这个需求,于是就想着开发一个通用组件拿出来使用(写完之后才发现element就有,后悔了哈哈哈&#x1f62d;&#x1f62d;) 示例图…

回车不搜索直接页面刷新问题解决

使用技术栈&#xff1a;vue3、elementUiPlus 问题&#xff1a;回车触发方法&#xff0c;会刷新整个页面&#xff0c;不执行搜索 解决方法&#xff1a;在搜索的表单中增加submit.native.prevent submit.native.prevent

LLM 合成数据生成完整指南

大型语言模型是强大的工具&#xff0c;不仅可以生成类似人类的文本&#xff0c;还可以创建高质量的合成数据。这种能力正在改变我们进行 AI 开发的方式&#xff0c;特别是在现实世界数据稀缺、昂贵或隐私敏感的情况下。在本综合指南中&#xff0c;我们将探索 LLM 驱动的合成数据…

学习测试8-数据库mysql操作

下载配置mysql 网络博客 使用 在Linux里 1 service mysql start 启动服务 2 在Navicatt 中连接Linux服务器 3 第一步 将所有文件上传到/opt目录下 第二步 chmod 777 deploy-mysql.sh 第三步 ./deploy-mysql.sh4 service mysql status 查看状态是否安装成功 5 重启mys…

WPS打开PDF文件的目录

WPS打开PDF文件的目录 其实WPS中PDF文件并没有像Word那样标准的目录&#xff0c;但是倒是有书签&#xff0c;和目录一个效果 点击左上角书签选项&#xff0c;或者使用Alt Shift 1快捷键即可

『Django』自带的后台

theme: smartblue 本文简介 点赞 关注 收藏 学会了 上一篇讲了 Django 操作 MySQL 的方法&#xff0c;讲了如何创建模型&#xff0c;如何对数据库做增删改查的操作。但每次修改数据都要写代码&#xff0c;多少有点麻烦。 有没有简单一点的方法呢&#xff1f; 有的有的&#…

centos 安装ffmpeg

这个错误表明在你的 CentOS 系统的默认仓库中没有 ffmpeg 包。CentOS 的默认仓库通常不包含 ffmpeg&#xff0c;因为它涉及一些许可证问题。但是&#xff0c;你可以通过添加第三方仓库来安装 ffmpeg。 使用 EPEL 和 RPM Fusion 仓库 # 安装 EPEL 仓库 sudo yum install epel-…

苹果入局,AI手机或将实现“真智能”?

【潮汐商业评论/原创】 “AI应用智能手机不就是现在的AI手机。” 当被问到现阶段对AI手机的看法时&#xff0c;John如是说。“术业有专攻&#xff0c;那么多APP在做AI功能&#xff0c;下载用就是了&#xff0c;也用不着现在换个AI手机啊。” 对于AI手机&#xff0c;或许大多…

Windows中安装部署MinIo文件系统,在Spring Boot中引入MinIo依赖实现上传文件到MinIo文件系统中

minio安装部署可以看这篇教程&#xff1a;https://blog.csdn.net/qq_43108153/article/details/134016896 创建桶 将私有设置成公开 导入依赖 <!-- minio --> <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId>…

【正点原子K210连载】第二十一章 machine.UART类实验摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第二十一章 machine.…

Java中HashMap详解:hash原理、扩容机制、线程不安全及源码分析

前言 HashMap 是 Java 中常用的数据结构之一&#xff0c;用于存储键值对。在 HashMap 中&#xff0c;每个键都映射到一个唯一的值&#xff0c;可以通过键来快速访问对应的值&#xff0c;算法时间复杂度可以达到 O(1)。 HashMap 的实现原理是基于哈希表的&#xff0c;它的底层是…

禁用华为小米?微软中国免费送iPhone15

微软中国将禁用华为和小米手机&#xff0c;要求员工必须使用iPhone。如果还没有iPhone&#xff0c;公司直接免费送你全新的iPhone 15&#xff01; 、 这几天在微软热度最高的话题就是这个免费发iPhone&#xff0c;很多员工&#xff0c;收到公司的通知。因为&#xff0c;登录公司…

ITSS服务经理职责与认可情况分析

随着信息技术的高速发展和广泛应用&#xff0c;企业对信息技术管理和应用的需求日益凸显。 为满足这一迫切需求&#xff0c;对具备专业知识和技能的人才的需求也日益增长&#xff0c;他们负责管理和实施相关项目。 因此&#xff0c;ITSS服务项目经理证书应运而生&#xff0c;这…

提升Selenium在Chrome上的HTML5视频捕获效果的五个方法

在使用Selenium进行网页自动化测试时&#xff0c;捕获HTML5视频是一个常见的需求。然而&#xff0c;许多开发者发现&#xff0c;在使用Chrome浏览器时&#xff0c;视频捕获效果并不理想&#xff0c;经常出现视频背景为空白的问题。本文将概述五种方法&#xff0c;帮助提升Selen…

基于语义的法律问答系统

第一步&#xff0c;准备数据集 第二步&#xff0c;构建索引数据集&#xff0c;问答对数据集&#xff0c;训练数据集&#xff0c;召回评估数据集 第三步&#xff0c;构建dataloader,选择优化器训练模型&#xff0c;之后召回评估 第四步&#xff0c;模型动转静&#xff0c;之后…

eplan软件许可优化解决方案

Eplan软件介绍 Eplan是一款专业的电气设计软件&#xff0c;用于自动化工程和电气系统的设计与文档化。它由德国的Eplan Software & Service GmbH开发&#xff0c;并在全球范围内广泛应用于工程设计和电气工程领域。 Eplan软件提供了全面的工具和功能&#xff0c;以简化和优…

Vue3 引入腾讯地图 包含标注简易操作

1. 引入腾讯地图API JavaScript API | 腾讯位置服务 (qq.com) 首先在官网注册账号 并正确获取并配置key后 找到合适的引入方式 本文不涉及版本操作和附加库 据体引入参数参考如下图 具体以链接中官方参数为准标题 在项目根目录 index.html 中 写入如下代码 <!-- 引入腾…

微软的人工智能语音生成器在测试中达到与人类同等水平

微软公司开发了一种新的神经编解码语言模型 Vall-E&#xff0c;在自然度、语音鲁棒性和说话者相似性方面都超越了以前的成果。它是同类产品中第一个在两个流行基准测试中达到人类同等水平的产品&#xff0c;而且显然非常逼真&#xff0c;以至于微软不打算向公众开放。 VALL-E …

车载测试资料学习和CANoe工具实操车载项目(每日直播)

每日直播时间&#xff1a;&#xff08;直播方式&#xff1a;腾讯会议&#xff09; 周一到周五&#xff1a;20&#xff1a;00-23&#xff1a;00 周六与周日&#xff1a;9&#xff1a;00-17&#xff1a;00 向进腾讯会议学习的&#xff0c;可以关注我并后台留言 直播内容&#xff…

GPMC并口多通道AD采集案例,基于TI AM62x四核处理器平台!

GPMC并口简介 GPMC(General Purpose Memory Controller)是TI处理器特有的通用存储器控制器接口&#xff0c;是AM62x、AM64x、AM437x、AM335x、AM57x等处理器专用于与外部存储器设备的接口&#xff0c;如&#xff1a; (1)FPGA器件 (2)ADC器件 (3)SRAM内存 (4)NOR/NAND闪存 …