python—面向对象

面向对象概述

        Python面向对象编程(OOP)是一种程序设计方法,它将数据(属性)和行为(方法)封装成对象,并通过类来定义这些对象。面向对象编程的核心概念包括封装、继承和多态。下面将详细解释这些概念,并结合文章中的相关信息进行归纳。

一、面向对象的基本概念

  1. 类(Class)
    • 类是一个模板或蓝图,它定义了一组属性和方法,用于创建对象。
    • 在Python中,可以使用class关键字来定义一个类。例如:
class Person:  def __init__(self, name, age):  self.name = name  self.age = age  def say_hello(self):  print(f"Hello, my name is {self.name} and I am {self.age} years old.")
  1. 对象(Object)
    • 对象是类的实例,它是具有特定属性和方法的实体。
    • 通过实例化类来创建对象。例如:
person1 = Person("Alice", 25)  
person1.say_hello()  # 输出: Hello, my name is Alice and I am 25 years old.

二、面向对象的三大特性

  1. 封装(Encapsulation)
    • 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面(即方法)。
    • 在Python中,封装通常通过私有属性(以双下划线开头的属性)和私有方法(以双下划线开头的方法)来实现。但需要注意的是,Python中的封装并不是严格的,因为可以通过一些特殊方式访问私有属性和方法。
    • 封装保证了模块具有较好的独立性,使得程序维护修改较为容易。
  1. 继承(Inheritance)
    • 继承是一种面向对象编程的概念,它允许开发人员创建一个新类(子类或派生类),该类继承了现有类(父类或基类)的属性和方法。
    • 通过继承,子类可以重用父类的代码,从而减少代码的重复性。
    • Python支持多重继承,即一个子类可以继承多个父类。
    • 示例:
class Student(Person):  def __init__(self, name, age, major):  super().__init__(name, age)  self.major = major  def say_hello(self):  super().say_hello()  print(f"I am studying {self.major}.")
  1. 多态(Polymorphism)
    • 多态是一种面向对象编程的概念,它允许开发人员使用相同的接口来处理不同类型的对象。
    • 在Python中,多态是基于动态类型的,这意味着可以在运行时决定要调用哪个方法。
    • 示例:
def introduce(person):  person.say_hello()  
person1 = Person("Alice", 25)  
person2 = Student("Bob", 20, "Computer Science")  
introduce(person1)  
introduce(person2)

三、面向对象编程的优点

  1. 开发时间短,效率高:由于面向对象编程的可重用性,可以在应用程序中大量采用成熟的类库,从而缩短开发时间。
  2. 可靠性高:所开发的程序更强壮,因为面向对象编程强调封装和模块化,使得程序的各个部分相对独立,减少了错误传播的可能性。
  3. 易于维护、更新和升级:继承和封装使得应用程序的修改带来的影响更加局部化,降低了维护成本。

综上所述,Python面向对象编程是一种强大的程序设计方法,它通过类、对象以及封装、继承和多态等特性,提高了程序的可重用性、可靠性和可维护性。

面向过程 vs 面向对象
  • 面向过程
    • 步骤:分析出解决问题的步骤,然后逐步实现。
    • 例子:婚礼筹办包括发请柬(选照片、措词、制作)、宴席(场地、找厨师、准备桌椅餐具等)、婚礼仪式(定流程、请主持人)。
    • 公式:程序 = 算法 + 数据结构
    • 优点:所有环节、细节自己掌控。
    • 缺点:考虑所有细节,工作量大。
  • 面向对象
    • 步骤:找出解决问题的人(对象),然后分配职责。
    • 例子:婚礼筹办时,发请柬找摄影公司,宴席找酒店,婚礼仪式找婚庆公司。
    • 公式:程序 = 对象 + 交互
    • 思想层面
      • 可模拟现实情景,更接近于人类思维。
      • 有利于梳理归纳、分析解决问题。
核心概念
  1. 封装:根据职责将属性和方法封装到一个抽象的类中。
  2. 继承:实现代码的重用,相同的代码不需要重复的编写。
  3. 多态:不同的子类对象调用相同的父类方法,产生不同的执行结果。
示例代码
  • 在Dog类中封装方法game
class Dog:  def game(self):  print("Dog is playing.")
  • 定义XiaoTianDog继承自Dog,并重写game方法
class XiaoTianDog(Dog):  def game(self):  print("XiaoTianDog is playing fetch.")
  • 定义Person类,封装一个和狗玩的方法
class Person:  def play_with_dog(self, dog):  dog.game()  # 使用示例  
dog = XiaoTianDog()  
person = Person()  
person.play_with_dog(dog)  # 输出:XiaoTianDog is playing fetch.
单例设计模式
  • 单例设计模式:确保一个类仅有一个实例,并提供一个全局访问点。
  • Python 中的单例实现(简化版):
class Singleton:  _instance = None  def __new__(cls, *args, **kwargs):  if not cls._instance:  cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)  return cls._instance

  • 内置函数 dir()
    • 用途:传入标识符/数据,可以查看该对象内的所有属性及方法。
    • 示例:dir(object) 将列出对象object的所有属性和方法。
    • 技巧:利用dir()函数可以帮助快速了解对象的属性和方法,减少死记硬背的需要。
    • 注意:dir()返回的列表中,部分以双下划线(__)开头和结尾的方法是Python的内置方法或特殊属性,它们具有特殊意义。
  • 对象属性与方法访问
    1. 对象方法内部访问属性:在对象的方法内部,可以直接访问该对象的属性。
    2. 对象间属性独立性:同一个类创建的多个对象之间,其属性是互不干扰的,每个对象维护自己独立的属性状态。
  • 摆放家具需求
    • 房子(House)类
      • 属性:户型、总面积、家具名称列表(初始为空)。
      • 说明:新房子在创建时不包含任何家具。
    • 家具(HouseItem)类
      • 属性:名字、占地面积。
      • 示例家具及其占地面积:
        • 席梦思(bed):4平米
        • 衣柜(chest):2平米
        • 餐桌(table):1.5平米
    • 需求实现
      1. 将席梦思、衣柜、餐桌三件家具添加到房子中。
      2. 打印房子信息时,需包含户型、总面积、剩余面积(总面积减去所有家具占地面积之和)、家具名称列表。
  • 剩余面积计算
    • 在添加家具到房子时,需要更新房子的剩余面积。这通常通过遍历家具列表,累加各家具占地面积,并从总面积中减去得到。
示例代码框架
class HouseItem:  def __init__(self, name, area):  self.name = name  self.area = area  class House:  def __init__(self, layout, total_area):  self.layout = layout  self.total_area = total_area  self.furniture_list = []  def add_furniture(self, furniture):  self.furniture_list.append(furniture)  self.update_remaining_area()  def update_remaining_area(self):  self.remaining_area = self.total_area - sum(item.area for item in self.furniture_list)  def __str__(self):  return f"户型: {self.layout}, 总面积: {self.total_area}, 剩余面积: {self.remaining_area}, 家具名称列表: {[item.name for item in self.furniture_list]}"  # 使用示例  
house = House("三室一厅", 100)  
house.add_furniture(HouseItem("bed", 4))  
house.add_furniture(HouseItem("chest", 2))  
house.add_furniture(HouseItem("table", 1.5))  
print(house)

1. 变则疏之

  • 原则:将可能发生变化的地方独立封装,避免影响其他类。
  • 应用:在设计系统时,识别出可能变化的部分,如业务逻辑、数据格式等,将它们封装在独立的类或模块中,以便在需要时进行修改或替换,而不影响整体架构的稳定性。

2. 高内聚

  • 原则:类中各个方法都在完成一项任务(单一职责的类)。
  • 应用:确保每个类只负责一个相对独立的功能模块,避免一个类包含过多不相关的功能,以提高代码的可读性和可维护性。

3. 低耦合

  • 原则:类与类的关联性与依赖度要低(每个类独立),让一个类的改变尽量少地影响其他类。
  • 应用:通过接口、抽象类等方式降低类之间的直接依赖,增强系统的灵活性和可扩展性。例如,使用依赖注入、事件驱动等设计模式来降低类之间的耦合度。

注意

  • 过高的内聚可能导致高耦合(如类中仅包含一个方法),这在实际开发中应避免。
  • 过低的耦合可能导致低内聚(如类中包含所有方法),同样不利于系统的维护和扩展。

通过遵循上述原则,可以设计出更加健壮、灵活和易于维护的面向对象系统。

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

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

相关文章

前端知识点

HTML、CSS 相关 1、 BFC 1、BFC 是什么? BFC(Block Formatting Context) 格式化上下文; 指一个独立的渲染区域,或者说是一个隔离的独立容器;可以理解为一个独立的封闭空间。无论如何不会影响到它的外面 …

Elasticsearch-Rest-Client

Elasticsearch-Rest-Client&#xff1a;官方RestClient&#xff0c;封装了ES操作&#xff0c;API层次分明&#xff0c;上手简单。 1. 导入依赖 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high…

BUG TypeError: GPT2Model.forward() got an unexpected keyword argument ‘past’

TypeError: GPT2Model.forward() got an unexpected keyword argument past’ 环境 transformers 4.38.1详情 这是由于新版的transformers 对GPT2Model.forward() 参数进行了改变导致的错误。具体是past名称改为了 past_key_values 。 解决方法 找到错误语…

【Windows】draw.io(免费的开源跨平台绘图软件)软件介绍

软件介绍 draw.io 是一款免费且易于使用的在线流程图绘图软件&#xff0c;后来更名为 diagrams.net。它最初作为一个基于 Web 的应用程序提供&#xff0c;支持用户创建各种类型的图表、流程图、网络图、组织结构图、UML 图等。它是完全免费的、强大的、专业的、易于使用的和高…

分享:Motionity-开源的Web端动画编辑器

Motionity是一个免费且开源的Web端动画编辑器&#xff0c;它结合了After Effects和Canva的优点&#xff0c;为用户提供了强大的动画编辑功能。支持视频剪切、图像搜索过滤、文本动画库、图层蒙版等功能。 一、项目背景与特点 开源项目&#xff1a;Motionity是一个开源项目&…

黄子韬vs徐艺洋卫生间风波

【热搜爆点】黄子韬VS徐艺洋&#xff1a;卫生间风波背后的职场与友情界限探讨在这个充满欢笑与意外的综艺时代&#xff0c;《跟我出游吧》再次以它独有的魅力&#xff0c;引爆了一个既尴尬又引人深思的话题——“黄子韬要上徐艺洋的卫生间&#xff1f;”这不仅仅是一句简单的调…

Yarn的安装与配置

Yarn 是一个快速、可靠且安全的 JavaScript 包管理器&#xff0c;最初由 Facebook 开发&#xff0c;旨在提供比 npm 更快的依赖安装速度和更一致的包管理体验。以下是 Yarn 的安装与配置教程&#xff1a; 安装 Yarn 方法 1: 使用 npm 安装 如果你的系统已经安装了 Node.js …

基于YOLOv10深度学习的CT扫描图像肾结石智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【ajax实战02】数据管理网站—验证码登录

一&#xff1a;数据提交&#xff08;提交手机验证码&#xff09; 核心思路整理 利用form-serialize插件&#xff0c;收集对象形式的表单数据后&#xff0c;一并提交给服务器。后得到返回值&#xff0c;进一步操作 基地址&#xff1a; axios.defaults.baseURL http://geek.…

Keil5 ST-LINK setting闪退问题解决

1. 官网下载新版驱动文件 MDK uVision crashes when using ST-Link debugger 2. 解压替换 STLinkUSBDriver6.1.2.0Signed 我的库文件目录&#xff1a; D:\Tool\Keil5\ARM\STLink

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(六)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

【JS】纯web端使用ffmpeg实现的视频编辑器-视频合并

纯前端实现的视频合并 接上篇ffmpeg文章 【JS】纯web端使用ffmpeg实现的视频编辑器 这次主要添加了一个函数&#xff0c;实现了视频合并的操作。 static mergeArgs(timelineList) {const cmd []console.log(时间轴数据,timelineList)console.log("文件1",this.readD…

MatLab三维图形绘制基础

三维图形绘制 三维曲线 plot3 螺旋图绘制 % %三维图像:螺旋图绘制 clear; clc; t [0:0.1:10*pi];% 向量 x sin(t) t.*cos(t);%t是向量&#xff0c;用点乘 y cos(t) - t.*sin(t); z t; plot3(x,y,z); grid on;plot3 绘制同型矩阵 %% % plot3绘制同型矩阵 t [0:0.1:10*…

游戏AI的创造思路-技术基础-tanh函数详解

又来搞事情&#xff0c;总想着把sigmoid函数替换成其他函数作为激活函数&#xff0c;或者找到更合适某一段训练的函数&#xff0c;所以今天来聊聊tanh函数&#xff08;谁让咱当年差点去了数学系&#xff0c;结果还是在数学系转过去计算机的&#xff09; 目录 3.9. tanh函数详解…

【Rust基础入门】Hello Cargo

文章目录 前言Cargo是什么&#xff1f;Cargo的作用查看cargo版本使用cargo创建项目Cargo.toml文件cargo build命令cargo runcargo check为发布构建 总结 前言 在Rust编程中&#xff0c;Cargo扮演着至关重要的角色。它是Rust的包管理器&#xff0c;负责处理许多任务&#xff0c…

uniapp入门

一、新建项目 进入到主界面&#xff0c;左上角点击新建——1.项目 输入项目名称&#xff0c;Vue版本选择3 二、创建页面 选中左侧文件目录里的pages文件夹&#xff0c;右键&#xff0c;选择新建页面 1输入名称 2选中“创建同名目录” 3选择模板&…

昇思25天学习打卡营第7天|网络构建

网络构建 神经网络模型由tensor操作和神经网络层构成。 MIndSporezhong&#xff0c;Cell是构建所有网络的基类&#xff0c;也是网络的基本单元。cell也由子cell构成。 定义模型类 # 继承nn.Cell类 class Network(nn.Cell):def __init__(self):super().__init__()self.flatte…

ElasticSearch 和 MySQL的区别

MySQLElasticSearch 数据库&#xff08;database&#xff09;索引&#xff08;index&#xff09;数据表&#xff08;table&#xff09; 类型&#xff08;type&#xff09; 记录文档&#xff08;document&#xff0c;json格式&#xff09; 一、ES基础命令 1. ES cat查询命令 2.…

分布式技术专题 | TCP在分布式网络中的通信机制与底层实现

深入解析分布式网络中的TCP通信协议实现 跨地域通信与资源共享网络节点与主机的定义网络技术通信机制TCP/IP协议模型TCP/IP分层机制TCP的Socket链接处理控制TCP的优势和特性自动差错控制正确性和有序性 TCP的Socket使用端口在应用程序间通信TCP的Socket使用端口套接字操作 跨地…

uniapp封装虚拟列表滚动组件

uniapp封装虚拟列表滚动组件 这里用到一个列表&#xff0c;然后数据可能有很多很多…&#xff0c;一次性全部渲染到dom上会卡顿&#xff0c;很废性能&#xff0c;于是用了这个虚拟列表就变丝滑很多很多。 组件mosoweInventedList 代码&#xff1a; <!-- 虚拟滚动列表组件&a…