Python小白学习教程从入门到入坑------第二十三课 封装(语法进阶)

面向对象的三大特征:封装、继承、多态

一、封装

1.1 何为封装

封装:在Python中指的是隐藏对象中一些不希望被外部所访问到的属性或者方法。将复杂的信息、流程给包起来,内部处理,让使用者只需要通过简单的操作步骤,就能实现。

在Python中,封装(Encapsulation)是面向对象编程(OOP)的一个核心概念。

规范的说法:封装指的是将对象的属性和方法结合在一起,并隐藏对象的内部实现细节,只通过公开的接口(通常是方法)与外部进行交互。封装的目的在于保护对象的内部状态,防止外部代码直接访问和修改,从而确保对象的完整性和安全性。

当不使用封装时,类里面的属性可以被看见甚至可以被修改

eg:

class Person:name = 'junjun'    # 类属性
pe = Person()
print(pe.name)      # 输出内容:junjun
Person.name = 'yuyu'
print(Person.name)  # 输出内容:yuyu
print(pe.name)      # 输出内容:yuyu

这种不封装的代码很容易被篡改,会带来一系列的安全问题,为了解决安全性这一问题,我们要对类进行封装操作

1.2 隐藏属性(私有权限)

隐藏属性:只允许在类的内部使用,无法通过对象访问

在属性名或者方法名前面加上两个下划线__

class Person:name = "junjun"   # 类属性__age = 18        # 隐藏属性
pe = Person()
print(pe.name)
print(pe.__age)    #报错: __age被隐藏,不可以在类的外部访问类的隐藏属性

但如果类的隐藏属性已经被定义好了,我们又需要从外边访问它的值该怎么做呢?

这里有两种方法:

第一种: (了解即可,不太正规)

注意:隐藏属性实际上是将名字修改为:_类名__属性名,上面例子中的__age 就被修改为_Person__age

eg:

class Person:name = "junjun"   # 类属性__age = 28        # 隐藏属性
pe = Person()
print(pe.name)
# print(pe.__age)    #报错: __age被隐藏,不可以在类的外部访问类的隐藏属性
print(pe._Person__age)
# 输出结果:
# junjun
# 28

此种方法也可以对隐藏属性进行修改

class Person:name = "junjun"   # 类属性__age = 28       # 隐藏属性
pe = Person()
print(pe.name)
# print(pe.__age)    #报错: __age被隐藏,不可以在类的外部访问类的隐藏属性
print(pe._Person__age)
pe._Person__age = 18
print(pe._Person__age)
# 输出结果:
# junjun
# 28
# 18

 第二种:在类的内部访问——推荐使用,正规手段

eg:

class Person:name = "junjun"   # 类属性__age = 28       # 隐藏属性def introduce(self):   # 实例方法Person.__age = 16    # 可以对隐藏属性进行更改print(f"{Person.name}的年龄是{Person.__age}")  # 在实例方法中访问类属性和隐藏属性
pe = Person()
pe.introduce()
# 输出结果:junjun的年龄是16

1.3 私有属性/方法

1. xxx:普通属性/方法,如果是类中定义的,则类可以在任何地方使用

2. _xxx: 单下划线开头,声明私有属性/方法,如果定义在类中,外部可以使用,子类也可以继承,但是在另一个py文件中通过 from  xxx   import  *  导入时,无法导入。此种命名方法一般是为了避免与Python关键字冲突而采用的命名方法

3. __xxx: 双下划线开头,隐藏属性,如果定义在类中,无法在外部直接访问,子类不会继承,要访问只能通过间接的方式,另一个py文件中通过 from  xxx  import  *导入时,也无法导入 。这种命名方法一般是Python中的魔法方法或属性,都是有特殊含义或者功能的,自己不要轻易定义

eg:

class Person:name = "junjun"   # 类属性__age = 28       # 隐藏属性(双下划线)_sex = "女"      # 私有属性(单下划线)
pe = Person()
# print(pe.sex)  报错
# 使用对象名._属性名调用
print(pe._sex)
# 使用对象._类名__属性名访问隐藏属性
print(pe._Person__age)
# 输出结果:
# 女
# 28

1.4 隐藏方法 

在Python中,没有严格意义上的“隐藏方法”的概念,因为Python是一种动态类型语言,并且其访问控制机制相对宽松

然而,有一些约定俗成的命名和编码规范,可以让开发者通过命名来暗示方法的可见性和使用意图 

class Man:def __play(self):     # 隐藏方法print("玩手机")def funa(self):       # 平平无奇的实例方法print("平平无奇的实例方法")Man.__play(self)   # 在实例方法中调用私有方法   ————不推荐self.__play()     # 推荐使用,更简便
ma = Man()
ma.funa()

1.5 私有方法

在Python中,尽管没有像其他某些编程语言(例如Java)那样的严格访问修饰符来定义私有方法,但Python有一种约定俗成的方式来暗示某个方法是私有的

这种方式主要是通过在方法名前添加一个下划线前缀(_)来实现的。需要注意的是,这仅仅是一种约定,而不是Python语言本身的强制规则

私有方法通常被设计为仅在类的内部使用,而不应被类的外部代码直接调用

尽管从技术上讲,外部代码仍然可以访问这些以单下划线开头的方法,但按照Python的社区规范,这样的访问是不被推荐的,因为它违背了封装的原则

eg:

class MyClass:  def __init__(self, value):  self._private_value = value  # 私有属性  def _private_method(self):  # 这是一个私有方法,它应该只在类的内部被调用  print(f"Private value is: {self._private_value}")  def public_method(self):  # 这是一个公共方法,它可以被类的外部代码调用  self._private_method()  # 在类的内部调用私有方法  # 创建类的实例  
obj = MyClass(42)  # 调用公共方法,它会间接调用私有方法  
obj.public_method()  # 输出: Private value is: 42  # 直接调用私有方法(虽然技术上可行,但不符合Python的封装原则)  
# obj._private_method()  # 这行代码在技术上是可行的,但通常不建议这样做

在上面的示例中,_private_method 是一个私有方法,它应该只在 MyClass 类的内部被调用

public_method 是一个公共方法,它可以被类的外部代码调用,并且它内部调用了私有方法 _private_method

尽管可以通过 obj._private_method() 直接调用私有方法,但这样做违背了封装的原则,并可能导致代码的可维护性和可读性降低

因此,建议遵循Python的社区规范,不要直接访问以单下划线开头的私有方法和属性

需要注意的是,双下划线前缀(__)会导致Python进行名称改写(name mangling),但这通常用于避免子类意外覆盖父类的方法或属性,而不是用于定义私有方法

使用双下划线前缀的方法名会在类定义时被改写为 _ClassName__methodName 的形式,但仍然可以通过这个改写后的名称在外部访问

因此,双下划线前缀也不是严格意义上的私有方法定义

今天的分享就到这里了,希望能帮助到大家~

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

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

相关文章

Rust 力扣 - 643. 子数组最大平均数 I

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的最大和即可&#xff0c;遍历过程中刷新最大值 结果为窗口长度为k的最大和 除以 k 题解代码 impl Solution {pub fn find_max_average(nums: Vec<…

Vscode使用launch.json进行传参调试代码

目录 1 操作2 后记 1 操作 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","…

Fooocus图像生成软件本地部署教程:在Windows上快速上手AI创作

文章目录 前言1. 本地部署Fooocus图像生成软件1.1 安装方式1.2 功能介绍 2. 公网远程访问Fooocus3. 固定Fooocus公网地址 前言 本篇文章将介绍如何在本地Windows11电脑部署开源AI生图软件Fooocus&#xff0c;并结合Cpolar内网穿透工具轻松实现公网环境远程访问与使用。 Foooc…

#渗透测试#SRC漏洞挖掘#自动化脚本的编写01

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

python 使用进程池并发执行 SQL 语句

这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理&#xff0c;绕过 Python 的全局解释器锁&#xff08;GIL&#xff09;限制&#xff0c;从而在多核 CPU 上并发执行多个 SQL 语句。 from pyhive import hive import multiprocessing# 建立连接 conn hive.…

SpringBoot+VUE2完成WebSocket聊天(数据入库)

下载依赖 <!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- MybatisPlus --><dependency><groupId>com.ba…

电子电气架构 --- 车载诊断的快速入门

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

继承的内容

封装&#xff1a; 1.在类中&#xff0c;把数据和方法放在一起&#xff0c;只展示成员函数&#xff0c;不展示定义的数据为私有。 2.一个类型放到另一个类型里面&#xff0c;通过typedef成员函数调整&#xff0c;封装另一个全新的类型。相当于是一个包装。 继承&#xff1a; st…

设计模式之结构型模式---装饰器模式

目录 1.概述2.类图3.应用场景及优缺点3.1 应用场景3.2 优缺点3.2.1 优点3.2.2 缺点 4.实现4.1 案例类图4.2 代码实现4.2.1 定义抽象构建角色4.2.2 定义具体构建角色4.2.3 定义抽象装饰器角色4.2.4 定义具体装饰角色4.2.5 装饰器模式的使用 1.概述 装饰器模式是指在不改变现有对…

接口测试(十一)jmeter——断言

一、jmeter断言 添加【响应断言】 添加断言 运行后&#xff0c;在【察看结果树】中可得到&#xff0c;响应结果与断言不一致&#xff0c;就会红色标记

vue-i18n国际化多国语言i18n国际语言代码对照表

uniapp是自带有i18n这个插件 需要自己去给每一个需要国际化的字符去手动配置key&#xff0c;所以如果是已经完成的项目可能工作量就稍微有点大了 第一步&#xff1a; 语言命名是有规范的不能乱取名&#xff0c;具体可以参考国际语言代码 i18n国际语言代码对照表 zh_CN 中文(简体…

GitHub | 发布到GitHub仓库并联文件夹的方式

推送到Github 推送步骤如果你只想更新单个文件&#xff0c;只需在第 4 步中指定该文件的路径即可。可能问题一 效果 推送步骤 更新 GitHub 仓库中的文件通常涉及以下步骤&#xff1a; 克隆仓库&#xff1a; 首先&#xff0c;你需要将 GitHub 上的仓库克隆到本地。使用 git …

Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问

文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器&#xff0c;并即时生成您的文档博客网站&#xff0c;结合…

杂货 | 每日资讯 | 2024.11.1

注意&#xff1a;以下内容皆为AI总结 2024年11月1日&#xff0c;人工智能&#xff08;AI&#xff09;领域发生了多项重要事件&#xff0c;标志着技术发展的新阶段。本文将详细探讨以下三大事件&#xff1a; OpenAI为ChatGPT新增搜索功能IEEE发布《2025年及以后的技术影响》报…

RuoYi 样例框架运行步骤(测试项目自用,同学可自取)

目录 后台 API 运行导入&#xff0c;下载包端口号mysql 准备运行 PC&#xff08;电脑端&#xff09;运行安装 nodejs安装 yarn 及其依赖&#xff0c;启动服务登录admin(admin123) 或 ry(admin123) App&#xff08;移动&#xff09;运行下载 HBuilderX运行app运行注意&#xff1…

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域&#xff0c;流量和搜索引擎优化&#xff08;SEO&#xff09;是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统&#xff0c;旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为&#xff0c;优化关键词排名&#xff0c;并…

项目解决方案:跨不同的物理网络实现视频监控多画面的实时视频的顺畅访问

目录 一、碰到的需求问题 二、需求分析 三、方案分析 &#xff08;一&#xff09;方法1&#xff1a;使用HTTP代理 1. 安装HTTP代理服务器 2. 配置Nginx代理 3. 重启Nginx 4. 访问视频流 &#xff08;二&#xff09;方法2&#xff1a;使用反向代理 1. 安装反向代理服务…

MQTT自动发送消息工具(自动化测试MQTT)

点击下载《MQTT客户端服务端工具》 点击下载《MQTT自动发送消息软件(自动化测试MQTT)》 1. 前言 在软件开发过程中&#xff0c;MQTT常被用作消息队列来完成特定的业务功能。当我们将相关业务代码编写完成后&#xff0c;通常需要编写额外的消息生产和消费代码来模拟消息高峰时…

东北虎豹国家公园shp格式范围

东北虎豹国家公园地处中国吉林、黑龙江两省交界的老爷岭南部&#xff08;珲春—汪清—东宁—绥阳&#xff09;区域&#xff0c;东起吉林省珲春林业局青龙台林场&#xff0c;与俄罗斯滨海边疆区接壤&#xff0c;西至吉林省大兴沟林业局岭东林场&#xff0c;南自吉林省珲春林业局…

练习LabVIEW第三十七题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十七题&#xff1a; 利用XY GRAPH 构成李萨如图形 开始编写&#xff1a; 前面板放一个XY图控件&#xff0c;程序框图…