Python基础篇(七):面向对象的编程思想

news2024/11/17 10:03:44

面向对象

  • 前言
  • 1. 面向对象编程思想
    • 1.1 面向对象的相关概念
    • 1.2 面向对象的三大特性
  • 2. 类的定义
    • 2.1 使用class关键字定义类
    • 2.2 创建类对象并调用属性和方法
  • 3.面向对象思想示例
    • 3.1 详细示例:图形类的设计
    • 3.2 基类 `Shape`
    • 3.3 子类 `Circle`
    • 3.4 子类 `Rectangle`
    • 3.5 使用图形类

前言

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程思想,它将数据和操作数据的方法封装在对象中。OOP的核心思想是以对象为中心,通过定义类来创建对象,并通过对象之间的交互来实现程序的功能。类的使用有助于组织和管理代码,并实现更高级的软件设计和开发。

1. 面向对象编程思想

1.1 面向对象的相关概念

  • 类:描述具有相同属性和方法的集合,简单来说就是模板(.py文件),通它来创建对象

  • 对象:类的实例

  • 方法:类中定义的函数

  • 类变量:定义在类中且在函数之外的变量,在所有实例化对象中公用

  • 局部变量:方法中定义的变量,只作用于当前实例

1.2 面向对象的三大特性

  1. 封装(Encapsulation):将数据和操作数据的方法封装在一个对象中,对象对外部隐藏了其内部实现细节,只暴露必要的接口供其他对象使用。
  2. 继承(Inheritance):通过创建子类来继承父类的属性和方法,子类可以重用父类的代码,并可以根据需要进行修改或扩展。
  3. 多态(Polymorphism):允许不同的对象对同一消息作出不同的响应,即不同的对象可以以自己的方式实现相同的方法。

2. 类的定义

2.1 使用class关键字定义类

在Python中,类的定义使用class关键字,后跟类的名称

示例:创建一个名为Person的类,表示人物,包含nameage属性,并具有一个greet方法来打招呼

class Person:
	
	# 构造函数
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    # 对象方法
    def greet(self):
        print(f"你好,俺叫 {self.name} ,今年{self.age}岁了")

在上面的示例中,我们定义了一个Person类。

  • __init__方法表示构造函数,用于初始化对象的属性。
  • self参数代表对象本身,它在方法中使用,以访问对象的属性和方法。
  • nameage是对象的属性。
  • greet方法用于向其他人打招呼,并输出对象的姓名和年龄。

2.2 创建类对象并调用属性和方法

示例:创建Person类的对象,并访问属性和调用方法。

person1 = Person("Lin", 25)
person2 = Person("kobe", 30)

print(person1.name)  # 输出: Lin
print(person2.age)  # 输出: 30

person1.greet()  
person2.greet()

在这里插入图片描述

3.面向对象思想示例

3.1 详细示例:图形类的设计

通过以下示例来说明面向对象编程的思想:我们将设计一个简单的图形类层次结构,包括基类Shape和两个子类CircleRectangle,来表示圆和矩形。

下面是Shape类以及两个子类CircleRectangle之间的关系图示:

	         +-----------+
	         |   Shape   |
	         +-----------+
                   ^
                   |
                   |
          +---------------+
          |               |
   +-------------+  +-------------+
   |   Circle    |  |  Rectangle  |
   +-------------+  +-------------+

3.2 基类 Shape

基类Shape表示图形的抽象概念,它具有通用的属性和方法。(这不奏是java的抽象类么)
在下面的示例中,Shape类具有一个构造函数__init__,用于初始化图形的颜色。它还定义了两个方法areaperimeter,这些方法在基类中只是占位符,需要在子类中实现

class Shape:
    def __init__(self, color):
        self.color = color
    
    def area(self):
        pass
    
    def perimeter(self):
        pass

3.3 子类 Circle

在下面的示例中,Circle类具有一个构造函数__init__,它接受颜色和半径作为参数,并调用父类的构造函数来设置颜色。它还实现了基类中定义的areaperimeter方法,计算圆的面积和周长。

import math

# 子类`Circle`表示一个圆形,它继承自基类`Shape`。
class Circle(Shape):
    def __init__(self, color, radius):
        super().__init__(color)
        self.radius = radius
    
    def area(self):
        return math.pi * self.radius**2
    
    def perimeter(self):
        return 2 * math.pi * self.radius

3.4 子类 Rectangle

在上面的示例中,Rectangle类具有一个构造函数__init__,它接受颜色、宽度和高度作为参数,并调用父类的构造函数来设置颜色。它还实现了基类中定义的areaperimeter方法,计算矩形的面积和周长。

# 子类`Rectangle`表示一个矩形,它也继承自基类`Shape`。
class Rectangle(Shape):
    def __init__(self, color, width, height):
        super().__init__(color)
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
    
    def perimeter(self):
        return 2 * (self.width + self.height)

3.5 使用图形类

现在我们可以创建CircleRectangle对象,并使用它们的属性和方法。

circle = Circle("red", 5)
print(circle.color)  # 输出: red
print(circle.radius)  # 输出: 5
print(circle.area())  # 输出: 78.53981633974483
print(circle.perimeter())  # 输出: 31.41592653589793

rectangle = Rectangle("blue", 4, 6)
print(rectangle.color)  # 输出: blue
print(rectangle.width)  # 输出: 4
print(rectangle.height)  # 输出: 6
print(rectangle.area())  # 输出: 24
print(rectangle.perimeter())  # 输出: 20

在上面的示例中创建了一个红色半径为5的圆形对象circle,并打印了其颜色、半径、面积和周长。
还创建了一个蓝色宽度为4、高度为6的矩形对象rectangle,并打印了其颜色、宽度、高度、面积和周长

总结:上面示例中我们把对象的属性color和 area,perimeter方法封装在Shape基类中,基类Shape表示图形的抽象概念 。circle 和 rectangle 类通过继承并调用父类的属性和构造函数来设置颜色,同时还实现了基类中定义的area和perimeter方法。并且相同的方法名实现了不同的行为,这就是多态的思想实现

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

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

相关文章

【Java-SpringBoot+Vue+MySql】Day5-前端进阶

目录 一、Axios网络请求 中文文档: 安装: 导入: 使用方法: 基本语法: 生命周期函数: 二、前端路由VueRouter 视频:12.前端路由VueRouter_哔哩哔哩_bilibili 参考文档: 三、状态管理VueX …

Linux设备驱动程序(三)——字符驱动

文章目录 前言一、scull 的设计二、主设备号和次设备号1、设备编号的内部表达2、分配和释放设备编号3、主编号的动态分配 三、一些重要的数据结构1、文件操作(file_operation)2、文件结构(struct file)3、inode 结构 四、字符设备…

【软件设计师暴击考点】黄金五题套路拿

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件…

AutoSAR系列讲解(入门篇)2.1-AppL概述

AppL概述 开局一张Autosar的框架图: 一、AppL的组成 二、先来举个例子 三、SWC的通信 四、SWC的分配 开局一张Autosar的框架图: 一、AppL的组成 AppL中最重要的就是SWC了,而SWC与其他SWC通信需要接口,每个SWC中又由runnable…

【C++篇】OOP上部分:封装类和对象

友情链接:C/C系列系统学习目录 知识总结顺序参考C Primer Plus(第六版)和谭浩强老师的C程序设计(第五版)等,内容以书中为标准,同时参考其它各类书籍以及优质文章,以至减少知识点上的…

C++【STL】之反向迭代器

反向迭代器 前面在vector和list的模拟实现中都有讲到正向迭代器,今天我们就来讲解一下反向迭代器的思想和模拟实现,在某些场景下还是很实用的,下面正文直接开始。 文章目录: 反向迭代器1. 反向迭代器结构2. 反向迭代器实现2.1 多…

一起学AI:核心基础概念

一起学AI:核心基础概念 AI基础概念什么是学习率?batchsize和epoch分别是什么?梯度消失与梯度爆炸是什么?什么是过拟合、欠拟合和泛化?归一化、正则化、标准化是什么?线性回归和逻辑回归是什么?神…

端午特别征文

前言 提示:这里可以添加本文要记录的大概内容: 韩顺平教育的java坦克大战 提示:以下是本篇文章正文内容,下面案例可供参考 一、Java绘图技术 1.g.drawOval()是什么? 画椭圆函数g.drawOval(); (宽高时候为圆形) …

Kafka系列之:一次性传送和事务消息传递

Kafka系列之:一次性传送和事务消息传递 一、目标二、关于事务和流的一些知识三、公共接口四、示例应用程序五、新配置六、计划变更1.幂等生产者保证2.事务保证 七、关键概念八、数据流九、授权十、RPC 协议总结1.获取请求/响应2.生产请求/响应3.ListOffset请求/响应…

GIT —— 基本操作,分支管理,远程操作

GIT 企业开发 最近找实习,在完善简历,遂发一发存货,有待持续完善,我认为这部分非常的有意义 1. 基本操作 1.1 创建,配置本地仓库 创建 mkdir gitcode cd gitcode git init配置 git config user.name "bts&quo…

HTTP 超文本传输协议

1.HTTP(Hypertext Transfer Protocol,超文本传输协议) 是一种用于传输超媒体文档(例如HTML文件,可以包含文本,视频,图片,音乐,地图定位)的应用层协议&#x…

【windows10】查看计算机的WIFI密码

【windows10】查看计算机的WIFI密码 1、背景2、操作 1、背景 无线路由器设置完密码后,经常会忘记。 当有新的设备需要接入网络的时候,如何能快速获得wifi密码呢? 本博客分享一种通过已联网的计算机来查看wifi密码。 2、操作 -step-2.1、打…

阿里云服务器的备案流程和规定如何?如何办理备案手续?

阿里云服务器的备案流程和规定如何?如何办理备案手续?   一、备案流程概述   阿里云服务器的备案流程分为五个主要步骤:1)实名认证;2)填写备案信息;3)上传资料;4&…

Web服务器群集:链路聚合与桥接

目录 一、理论 1.链路聚合 2.bond模式 3.team模式 4.bond和team区别 二、实验 1.实现bond网络接口 2.实现team网络接口 三、总结 一、理论 1.链路聚合 (1)概念 链路聚合(Link Aggregation),它是一个计算机…

【Vue】Vite基础学习

文章目录 Vite 基础学习一、单页面应用程序二、Vite 基本使用2.1 创建 vite 项目2.2 项目结构2.3 项目运行流程 Vite 基础学习 一、单页面应用程序 单页面应用程序(英文名:Single Page Application)简称 SPA,顾名思义&#xff0c…

springboot:定时任务

目录 一、实现定时任务的方法一:基于JDK 方法一:使用JDK自带的Timer类 法二:使用ScheduleExecutorsService类 二、基于Spring Task实现定时任务(推荐使用) 三、基于Quartz实现定时调度 四、使用分布式定时任务框架:elastic-j…

基础-进阶-升级~图解SpringSecurity的RememberMe流程|源码

前言 今天我们来聊一下登陆页面中“记住我”这个看似简单实则复杂的小功能。 如图就是博客园登陆时的“记住我”选项,在实际开发登陆接口以前,我一直认为这个“记住我”就是把我的用户名和密码保存到浏览器的 cookie 中,当下次登陆时浏览器…

关于Synchronized的小结

目录 一.特性 1.既是乐观锁又是悲观锁 2.是轻量级锁,也是重量级锁 3.不是读写锁,是互斥锁 4.是可重入锁 5.非公平锁 6.加锁之后,运行完毕自动解锁释放资源 二:Synchronized使用 第一种:定义一个额外的变量来控制加锁和解锁(类似于吉祥物) 第一种:直接给类/方法上锁 三…

【Linux】MySQL备份与恢复

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MySQL备份与恢复 一、数据备份的重要性1.数据库备份的分类2.常见的备份方法3.MySQL完全备份与分类 二、MySQL 日志管理三、MySQL 备份与恢复1.MySQL 完全备份1.物理冷备份与恢…

Linux 服务器以及各个系统下安装

Linux 服务器 Linux是操作系统: Linux作为自由软件和开放源代码软件发展中最著名的例子,背靠社区与商业化的使用,使其得到了广泛的应用与发展。 Linux无处不在: 世界上500个最快的超级计算机90%以上运行Linux发行版…