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.mfbz.cn/a/767681.html

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

相关文章

Qt——升级系列(Level Eight):界面优化

目录 QSS 背景介绍 基本语法 QSS设置方式 指定控件样式设置 全局样式设置 从文件加载样式表 使用Qt Designer 编辑样式 选择器 选择器概况 子控件选择器 伪类选择器 样式属性 盒模型 控件样式示例 按钮 复选框、单选框 输入框 列表 菜单栏 登录界面 绘图 基本概念 绘制各种形…

【Kali-linux for WSL】图形化界面安装

文章目录 前言图形化界面安装 前言 之前在WSL中安装了Kali 启动之后发现什么都没有!!! 那我还怎么学习渗透技术??? 看来,得改进下我的kali-linux for wsl,安装个图形化界面 图形化…

Jetson系列机载电脑创建热点模式配置方法

Jetson nano为例—— 创建热点模式配置方法 1.1、新建一个 WiFi 在屏幕右上角找到网络图标,点击后选择“Edit Connections”选项,进入选择网络连接页面,然后点击左下角加号,新建一个连接,类型选择 WiFi 后点击 “cre…

AI降重,不再难:降AI率的实用技巧大揭秘

如何有效降低AIGC论文的重复率,也就是我们说的aigc如何降重?AIGC疑似度过高确实是个比较愁人的问题。如果你用AI帮忙写了论文,就一定要在交稿之前做一下AIGC降重的检查。一般来说,如果论文的AIGC超过30%,很可能会被判定…

剪画小程序:如何将视频变成自己的作品!在手机上这样做就可以了!

亲爱的小伙伴们,我是你们的博主小画! 今天和大家分享两个在视频剪辑中实用的技巧—旋转视频和添加水印! 在我们的创作过程中,有时候常规的视角并不能完全展现出视频的魅力和创意。而通过旋转视频,就能为观众带来全新的…

【云原生监控】Prometheus 普罗米修斯从搭建到使用详解

目录 一、前言 二、服务监控概述 2.1 什么是微服务监控 2.2 微服务监控指标 2.3 微服务监控工具 三、Prometheus概述 3.1 Prometheus是什么 3.2 Prometheus 特点 3.3 Prometheus 架构图 3.3.1 Prometheus核心组件 3.3.2 Prometheus 工作流程 3.4 Prometheus 应用场景…

新规则!2024年信息素养大赛复赛图形化编程题这么写系统才能通过

2024年全国青少年信息素养大赛复赛即将在7月6日陆续开赛,今年Scratch图形化编程小低组和小高组分别为6道编程题,将采用新的判题规则,类似GESP的OJ系统判题,主要有以下三个方面: 1、变量名大小写要和题目完全一致。 2…

数据万象推出智能检索MetaInsight,现已开启限时公测

海量文件的分析统计一直是对象存储COS的热点需求,伴随AIGC飞速迭代发展,在众多不同模态素材的海洋中,用户也急需更高效地管理和利用多媒体内容,打破传统搜索的桎梏。 数据万象推出的智能检索 MetaInsight 服务将多模态检索与元数…

开源之夏|祝贺MatrixOne开源社区项目中选同学!

在本届「开源之夏 2024」活动中,MatrixOne开源社区共计上线3个项目任务,最终有 3位同学成功突围。接下来让我们看看每个项目的详细中选情况: 中选学生公示 项目名称:基于大语言模型的操作系统任务自动识别,拆解&#…

Unicode 和 UTF-8 以及它们之间的关系

通俗易懂的 Unicode 和 UTF-8 解释 Unicode 是什么? 想象一下,我们有一个巨大的图书馆,这个图书馆里有各种各样的书,每本书都有一个唯一的编号。Unicode 就像是这个图书馆的目录系统,它给世界上所有的字符&#xff0…

数据要素如何转化为生产力?关键在以指标为中心实现数据分析“快全准省”

进入到数字化时代,企业的经营变得越来越精细化、智能化、自动化,其中,数据就变成了关键要素,在企业的业务运营、经营决策、流程改进、创新驱动、资源配置等方面发挥出巨大作用。 数据具体如何转化为生产力,有几个关键…

俄罗斯ozon运费计算工具,跨境电商ozon物流运费计算工具

OZON平台服装类目卖家而言,如何快速、准确地为产品定价,并有效管理运费成本,直接关系到市场竞争力与利润空间。接下来我们看看俄罗斯ozon运费计算工具,跨境电商ozon物流运费计算工具。 萌啦Ozon定价工具:智能模拟&…

OCR text detect

主干网络 VoVNet:实时目标检测的新backbone网络_vovnet pytorch-CSDN博客 DenseNet: arxiv.org/pdf/1608.06993 密集连接: DenseNet 的核心思想是将网络中的每一层与其前面的所有层直接连接。对于一个 L 层的网络,DenseNet 具有…

【深度学习】扫描全能王的AI驱动创新与智能高清滤镜技术解析

目录 引言1、扫描全能王2、智能高清滤镜黑科技2.1、图像视觉矫正2.2、去干扰技术 3、实际应用案例3.1、打印文稿褶皱检测3.2、试卷擦除手写3.3、老旧文件处理3.4、收银小票3.5、从不同角度扫描文档 4、用户体验结论与未来展望 引言 在数字化时代背景下,文档扫描功能…

AI是在帮助开发者还是取代他们

目录 1.概述 1.1.AI助力开发者 1.2.AI对开发者的挑战 2.AI工具现状 2.1. GitHub Copilot 2.2. TabNine 2.3.小结 3.AI对开发者的影响 3.1.对开发者的影响 3.2.开发者需要掌握的新技能 3.3.在AI辅助的环境中保持竞争力的策略 4.AI开发的未来 5.总结 1.概述 生成式…

Git学习(常用的一些命令)

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 配置相关: 创建与克隆仓库: 基本操作: 分支操作: 远程仓库操作&#xff1a…

使用Adobe Acrobat对PDF文档进行数字签名

文章目录 前言一、使用Adobe Acrobat对PDF文档进行数字签名1.使用Adobe Acrobat打开需要进行签名的PDF文档2. 点击【查看更多】3.点击【使用证书】4.点击【数字签名】5.使用鼠标选定一个区域6.选择您需要使用的证书 → 点击【继续】7.点击【签名】8.签名成功 前言 一、使用Ado…

App渗透:BurpSuite插件-Brida apk逆向自动加解密Custom plugins演示

文章目录 前言Eureka 前言 【App渗透:BurpSuite插件-Brida apk逆向自动加解密Custom plugins演示】 很久很久之前,更新过Brida的安装和hook脚本的调试,今晚终于更新了Brida的核心功能,自动加解密。视频里演示的app是我自己开发的&#xff0c…

OpenLCA、GREET、R语言的生命周期评价方法、模型构建

原文链接:OpenLCA、GREET、R语言的生命周期评价方法、模型构建教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608240&idx6&sn1b5758206d500399fe7cc69e800f61fe&chksmfa826657cdf5ef413d31557941a1c5db5cc84bba8d0f408c469e05a4118c…

Ubuntu 22.04 LTS 上安装 MySQL8.0.23(在线安装)

目录 在线安装MySQL 步骤1:更新软件包列表 步骤2:安装MySQL服务器 步骤3:启动MySQL服务 步骤4:检查MySQL状态 步骤5:修改密码、权限 在线安装MySQL 步骤1:更新软件包列表 在进行任何软件安装之前&a…