python 面向对象编程(2)

news2025/1/8 14:13:04

在这里插入图片描述

文章目录

  • 前言
  • 封装
  • 多态
  • 类属性和实例属性
    • 定义以及访问类属性
    • 修改类属性
    • 实例属性
  • 类方法
  • 静态方法

前言

前面我们介绍了 python 类和对象以及继承、私有权限,那么今天我们将来介绍 python面向对象 剩下的两大特性封装、多态,以及如何访问、修改类属性、类方法和静态方法的介绍。🚗🚗🚗

封装

Python中的封装是一种面向对象编程的概念,它将数据和操作这些数据的方法封装到一个单独的单元中,这个单元通常被称为类(Class)。封装的基本思想是将数据和相关的操作(方法)组合在一起,形成一个相对独立的、可复用的整体。

封装的目的是隐藏对象的内部实现细节,只向外部暴露一些必要的接口,通过这些接口来访问和操作对象的状态。这样做的好处是增强了代码的可读性和可维护性,同时也提高了代码的安全性。

我们在类中定义的属性和方法都可以看做是封装。

class Person():
    name = 'zhangsan'
    age = 18
    gender = 'man'
    
    def print_info(self):
        print(f'一位名叫{self.name}{self.age}{self.gender}')

定义name、age、gender以及方法print_info都叫做封装。

多态

多态是一种可以根据不同的对象类型执行不同的操作的能力。它允许多个不同的对象对相同的消息作出响应,以各自独特的方式执行操作,从而实现了代码的灵活性和可扩展性。

在 Python 中,多态性是通过方法的动态绑定和方法重写来实现的。具体来说,当一个对象调用一个方法时,实际执行的是与对象类型相关联的方法。

python 的多态不是只能依赖于继承,但是最好依赖于继承。

python 多态的实现步骤:

  1. 定义父类,并提供公共方法
  2. 定义子类,并重写父类方法
  3. 传递子类对象给调用者,可以看到不同子类执行效果不同
class Animal():
    def speak(self):
        pass

class Cat(Animal):
    def speak(self):  # 重写父类方法来实现多态
        print('喵喵喵')

class Dog(Animal):
    def speak(self):  # 同样重写父类方法,实现多态
        print('汪汪汪')

cat = Cat()
dog = Dog()
cat.speak()  # 喵喵喵
dog.speak()  # 汪汪汪

我们通过继承自一个父类的实例对象来调用同一个方法而实现了不同的功能,这就是多态的灵活性。

类属性和实例属性

定义以及访问类属性

  • 类属性就是类对象所拥有的属性,它被该类的所有实例对象所共有
  • 类属性可以通过类对象或实例对象访问
class Person():
    name = 'zhangsan'

person1 = Person();
print(person1.name)  # 通过实例对象来访问类属性  zhangsan
print(Person.name)  # 通过类对象来访问类属性  zhangsan

修改类属性

修改类属性只能使用 类名.类属性 = 值 来修改类属性。

class Person():
    name = 'zhangsan'

person1 = Person();
Person.name = 'lisi'
print(Person.name)  # lisi
print(person1.name)  # lisi

那么如果我们要使用 实例对象.类属性 = 值 会出现什么情况呢?

class Person():
    name = 'zhangsan'

person1 = Person();
person1.name = 'lisi'
print(Person.name)  # zhangsan
print(person1.name)  # lisi

**如果我们使用 实例对象.类属性 = 值 实际上修改的是实例属性。

实例属性

实例属性其实是另外开辟了一份与类属性同名的一块内存,修改实例属性并不会影响类属性。
在这里插入图片描述

class Person():
    name = 'zhangsan'

person1 = Person()
person2 = Person()
print(person1.name)  # zhangsan
print(person2.name)  # zhangsan
person1.name = 'lisi'
print(person1.name)  # lisi
print(person2.name)  # zhangsan
person2.name = 'wangwu'
print(person1.name)  # lisi
print(person2.name)  # wangwu

在这里插入图片描述

  • 类的实例记录的某项数据始终保持一致时,则定义类属性。
  • 实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间。

类方法

在 Python 中,类方法是一种特殊类型的方法,它与类本身相关联而不是与实例(对象)相关联。类方法可以在不创建类实例的情况下访问和操作类的属性和方法。

要定义一个类方法,需要使用 @classmethod 装饰器,将其放置在方法定义的上方。类方法的第一个参数通常被命名为 cls,它表示对类本身的引用。通过这个参数,可以访问类的属性和调用其他类方法。

  • 当方法中需要使用类对象 (如访问私有类属性等)时,定义类方法
  • 类方法一般和类属性配合使用
class Account():
    Account_name = '1234567'
    __Account_password = '987654'

    @classmethod
    def get_password(cls):
        return cls.__Account_password

result1 = Account.get_password()
print(result1)  # 987654
account1 = Account()
result2 = account1.get_password()
print(result2)  # 987654

静态方法

在 Python 中,静态方法是一种与类相关联的方法,它不需要访问类的实例或实例的属性。静态方法可以在不创建类实例的情况下调用,它归属于类而不是对象。

要定义一个静态方法,需要使用 @staticmethod 装饰器,将其放置在方法定义的上方。静态方法没有特殊的参数,它们不会自动传递类或实例的引用。

class Person():
    @staticmethod
    def print_info():
        print('这是一个静态方法')

Person.print_info()  # 这是一个静态方法
person1 = Person()
person1.print_info()  # 这是一个静态方法
  • 静态方法能够通过实例例对象和类对象去访问
  • 当方法中 既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象 (如类属性、类方法、创建实例等)时,定义静态方法
  • 取消不需要的参数传递,有利于减少不不必要的内存占用和性能消耗

在这里插入图片描述

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

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

相关文章

机器学习李宏毅学习笔记37

文章目录 前言一、ChatGPT做的事情二、ChatGPT基础介绍三、ChatGPT带来的研究问题总结 前言 ChatGPT简单原理介绍 一、ChatGPT做的事情 Chatgpt以句子为输入,输出这个句子后面接的词汇的概率分布,给每一个可能的符号一个概率,根据这个分布进…

【雕爷学编程】Arduino动手做(160)---HLK-V20离线语音模块2

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

RabbitMQ知识掌握 【进阶篇】

一、如何保证消息的可靠性 🍉 1.保证消息的可靠性投递 🥝 在生产环境中由于一些不明原因,导致 rabbitmq 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是&#xff0…

微信小程序活动抽奖简单实现,包教包会

问题: 针对用户使用活动抽奖,获得抽奖得到商品的成就以及满足感,那么我们应该怎么去实现小程序去转盘抽奖活动呢 例如:项目需要抽奖实现相应的奖品奖励 实现方法 实现的效果如下: 实现的主要代码: Page…

ANSYS Workbench项目分析与案例实操详解

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言准备工作创建项目导…

盘点5款Cesium三维GIS渲染引擎

目前,以Cesium为核心的各类产品繁多,本文将挑选一些以Cesium为核心的软件案例,为大家进行介绍。 1. CesiumJS CesiumJS相信凡是GIS行业相关人员都特别熟悉了,CesiumJS是一款开源的JavaScript库,用于创建高性能的地球…

以太网(Ethernet)入门了解

以太网(Ethernet)是一种常见的局域网(LAN)通信协议,它是由Xerox公司于1970年代中期开发的。以太网是一种基于广播技术的开放式网络协议,它允许设备在共享通信介质上进行通信。以下是关于以太网的基本概念、…

如何做到有效的项目质量管理?这三点很关键

“项目管理中,大家都遇到过的哪些绊脚石?” 近期看到了这样一个话题,大家纷纷吐槽了在项目中遇到的各种困难。除了常见的范围无限蔓延、进度不停延误、成本严重超支、内部沟通困难等一系列问题;其中提到次数较多的还有项目的质量…

QOwnNotes Mac版-QOwnNotes for Mac(事务笔记管理)

QOwnNotes for Mac是一款Mac平台上的笔记记录和待办事项软件,可以将你的笔记保存为纯文本文件,它支持 MarkDown 支持,并与 ownCloud 云服务紧密集成。 QOwnNotes 的亮点就是它集成了 ownCloud 云服务(当然是可选的)。…

JavaWeb 速通XML

目录 一、XML快速入门 1.基本介绍 : 2.入门案例 : 二、XML语法 0.文件结构 : 1.文档声明 : 2. 元素 : 3.属性 : 4.注释 : 5.CDATA节 : PS : XML转义符 : 三、Dom4j 1.关于XML解析技术 : 2 Dom4j介绍 : 3.Dom4j使用 : 1 获取Document对象的三种方式 2 …

ROS:Gazebo详解

目录 一、前言二、URDF与Gazebo基本集成流程2.1创建功能包2.2编写URDF文件2.3启动Gazebo并显示模型 三、URDF集成Gazebo相关设置3.1collision3.2inertial3.3颜色设置 四、URDF集成Gazebo实操4.1需求4.2流程4.3编写封装惯性矩阵算法的 xacro 文件4.4底盘 Xacro 文件4.5摄像头 Xa…

5个值得收藏字体网站,优秀字体不用再找

如何在大量的字体网站中选择安全可靠的字体呢?这里本文收集整理了5个好用的字体网站,一起来看看吧! 1、即时设计 对于设计师来说,一个好的字体网站要具备两个基本要素:美观和免费。如果你对字体有同样的要求,那么即时…

给测试开发工程师的5条建议——你一定要知道

目录 前言 质量心态 获取其他测试领域的知识 探索性测试 数据测试 可视化测试 可访问性测试 安全测试 混沌测试 获得正确的帮助 自动化不仅仅是执行测试脚本 分享也是学习的一种途径 最后 前言 近些年可以看出测试开发工程师是热度比较高的测试职位,除…

【深度学习】多任务学习

多任务学习是一个很火的话题,在自动驾驶领域以及其他对存储资源要求较高的端侧任务,都会考虑这种方式。之前面试的时候也有被问题多任务学习。前几天看到一个写得很好的例子,在此记录一下,也好久没有写博客了。 1.参考 论文是20…

samba服务

samba服务 1. samba诞生背景2. samba简介3. samba配置文件详解3.1 配置文件中参数的作用3.1.1 security参数的四种验证方式3.1.2 passdb backend定义用户后台的类型 4. samba服务部署与配置windos共享linux挂载共享 1. samba诞生背景 1987 年,微软公司和英特尔公司…

fastapi初使用,构建自己的api

文章目录 1、安装2、api实现2.1、 app.get("/1")2.2、app.get("/{a}")2.3、app.get("/{a}{b}")2.4、函数和api分离 3、运行 原文链接:https://wangguo.site/posts/d98bb3c9.html fastapi 是一个基于 Python 的 API 构建框架&#xff…

C国演义 [第八章]

第八章 买卖股票的最佳时机题目理解步骤dp含义递推公式初始化遍历方向 代码 买卖股票的最佳时机II题目理解步骤dp含义递推公式初始化遍历方向 代码 买卖股票的最佳时机 力扣链接 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格 …

IDEA使用方式

1.翻译 1.Plugins插件:Chinese中文插件 文件F 编辑E 视图V 导航N 代码C 分析Z 重构R 构建B 运行U 工具T VCSS 窗口W 帮助H文件N 新建N 打开 打开最近 关闭项目 设置T 项目结构 文件属性 保存全部S 从磁盘全部重新加载 作废缓存/重启 导出/导入操作 其他设置 导出 打…

路径规划算法:基于协作搜索优化的路径规划算法- 附代码

路径规划算法:基于协作搜索优化的路径规划算法- 附代码 文章目录 路径规划算法:基于协作搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

suse linux 日语字库相关

问题 最近遇到一个日语字库的问题,界面上同一个label显示的日语字体大小都不一样, 如下图,圈出的部分字体大小和其他部分不一样。 分析 考虑两种情况 配置文件有问题缺少字库文件 检查配置文件 参考suse官方文档https://en.opensuse.o…