Python 面向对象——6.封装

本章学习链接如下:

Python 面向对象——1.基本概念

Python 面向对象——2.类与对象实例属性补充解释,self的作用等

Python 面向对象——3.实例方法,类方法与静态方法

Python 面向对象——4.继承

Python 面向对象——5.多态

1. 封装的基本概念

封装是将属性和方法结合在一起的机制,同时限制对对象内部实现的直接访问。在Python中,封装通常是通过定义类和使用私有变量(以双下划线开头)来实现的。封装的主要目的是隐藏对象的内部状态和复杂性,只暴露出一个清晰和简洁的接口供外部代码使用。

(1)私有变量

私有变量是一种访问限制机制,用于限制类外部对类内部属性或方法的直接访问。

命名约定:在Python中,私有变量通常以两个下划线(_ _)开头。例如:_ _my_variable。那这是怎样做到的呢?源于Python中的名称重整机制。

(2)名称重整规则 

  1. 如果属性名以双下划线开头,但不以下划线结尾(_ _name),那么在名称重整时,会将属性名中的双下划线替换为类名,然后再加上一个单下划线。例如,对于类MyClass中的属性_ _my_variable,重整后的名称将是_MyClass_ _my_variable

  2. 如果属性名以双下划线开头,并且以下划线结尾(_ _my_variable_ _),那么在名称重整时,会保留一个下划线在属性名的开头和结尾。例如,对于类MyClass中的属性_ _my_variable_ _,重整后的名称将是 _MyClass_ _my_variable_ _

我们看下面这个代码示例,self._ _salary 是一个私有属性,它被声明为私有的,因为它的名称以双下划线开头。根据名称重整规则,这个属性在类外部的名称将变为 _Employee_ _salary。self._ _top_secret() 是一个私有方法,同样因为以双下划线开头,它在类外部的名称将变为 _Employee_ _top_secret。当我们尝试直接访问这些私有成员时,Python解释器会抛出一个 AttributeError,因为它找不到这些属性或方法。然而,如果我们知道了名称重整后的名称,我们仍然可以访问到这些私有成员,但这违反了封装的原则,因此通常不推荐这样做。

请注意,尽管我们可以通过名称重整后的名称访问私有成员,但这并不是Python推崇的做法。更好的做法是通过类的公有接口(如方法)来访问或修改私有成员,以保持类的封装性。

class Employee:def __init__(self, name):self.name = name  # 公开属性self.__salary = 50000  # 私有属性,使用双下划线开头def give_raise(self, amount):self.__salary += amountprint(f"{self.name}'s new salary is: ${self.__salary}")def __top_secret(self):pass  # 私有方法,使用双下划线开头# 创建Employee类的实例
emp = Employee("Alice")# 尝试直接访问私有属性(这将不会成功)
try:print(emp.__salary)  # 错误:__salary不是Employee的属性
except AttributeError as e:print(e)# 尝试调用私有方法(这也将不会成功)
try:emp.__top_secret()  # 错误:__top_secret不是Employee的方法
except AttributeError as e:print(e)# 使用公开方法访问私有属性
print(f"{emp.name}'s salary is: ${emp._Employee__salary}")

请注意,名称重整并不是真正的私有化,而是一种约定。它通过名称改写来减少属性被外部访问的可能性,但并不阻止有经验的程序员绕过这个机制。在Python中,如果你想要完全私有的属性,可以使用单下划线开头的属性名(_my_variable),但这只是一种约定,表示该属性不应该被外部直接访问。

(3)try:

tryexcept语句用于异常处理。当你执行一个可能会抛出异常的代码段时,可以将该段代码放在try块中。如果在try块中的代码执行过程中发生了异常,程序的执行将不会立即停止,而是会跳转到except块中,这允许你捕获并处理异常。

在这段代码示例中,try块用于尝试访问Employee类的私有属性_ _salary和调用私有方法_ _top_secret。根据Python的命名规则,以双下划线开头的属性和方法对外部是不可访问的,因为它们被视为私有的(尽管这不是一种真正的私有机制,只是一种命名约定)。

代码中的两个try块尝试执行如下操作:

  1. 尝试直接访问emp实例的私有属性_ _salary。由于_ _salary是私有的,这个尝试会抛出AttributeError,因为_ _salary不是Employee实例的公开属性。

  2. 尝试调用emp实例的私有方法_ _top_secret。同样,由于_ _top_secret是私有的,这个尝试也会抛出AttributeError

2.错误捕获

(1)背后的原理

except AttributeError as e:print(e)

 当AttributeError被捕获时,变量e是一个异常对象。这个对象包含了异常的详细信息,当你打印e时,实际上是调用了该对象的__str__()方法,它返回异常的描述性字符串。

当你打印一个异常对象时,背后实际上是调用了该对象的__str__()方法。这是Python对象的内置特殊方法(也称为"dunder"方法,即双下划线前缀和后缀的方法),用于返回对象的字符串表示形式。即使在给定的类定义中没有显式地看到__str__()方法,它也是隐式存在的,因为所有的Python对象默认继承自object类,而object类提供了一个默认的__str__()实现。

异常类(如AttributeError)通常会重写__str__()方法,以返回一个描述错误的字符串。当你执行print(e),Python首先查找对象e__str__()方法,并调用它来获取字符串表示,然后打印出来。

这是Python中所有异常对象的标准行为,所以即使你在类定义中没有看到显式的__str__()方法,当你打印异常对象时,它也是可用的。

下面是一个简单的示例,展示如何自定义一个类并重写__str__()方法:

在上面的代码中,我们创建了一个自定义异常MyError,它继承自Python的基类Exception。我们重写了__str__()方法来返回一个自定义的错误信息。当异常被捕获并打印时,会显示我们提供的信息。

class MyError(Exception):def __str__(self):return "自定义错误信息"try:raise MyError()
except MyError as e:print(e)  # 输出: 自定义错误信息

(2)Exception

Python的Exception类是所有内置和用户定义的异常的基类。它位于异常类继承层次结构的顶端,提供了处理异常时的默认行为。在Python中,异常是用于错误处理的一种机制,允许程序在发生错误时从代码的某个部分“跳出”,并提供一种方式来响应或恢复。

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

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

相关文章

每日一练-LeeCode-移除链表元素

题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2: 输入&a…

【AI开发:音频】二、GPT-SoVITS使用方法和过程中出现的问题(GPU版)

1.FileNotFoundError: [Errno 2] No such file or directory: logs/guanshenxxx/2-name2text-0.txt 这个问题中包含了两个: 第一个:No module named pyopenjtalk 我的电脑出现的就是这个 解决:pip install pyopenjtalk 第二个&#xff1a…

156.25MHz的差分晶体振荡器SG3225VEN

数字经济正焕发出勃勃生机,云计算,大数据,5G和人工智能等新技术的发展给行业带来了新的机遇。无论是在数据中心内部还是在数据中心之间,提供低成本,高速的100/200/400G小型化解决方案都是光模块的发展需求。为了使DSP稳定工作,需要一个小型的封装晶体振荡器来提供参…

13.JAVAEE之HTTP协议

HTTP 最新的版本应该是 HTTP/3.0 目前大规模使用的版本 HTTP/1.1 使用 HTTP 协议的场景 1.浏览器打开网站 (基本上) 2.手机 APP 访问对应的服务器 (大概率) 学习 HTTP 协议, 重点学习 HTTP 的报文格式 前面的 TCP/IP/UDP 和这些不同, HTTP 的报文格式,要分两个部分来看待.请求…

「51媒体」城市推介会,地方旅游推荐,怎么做好媒体宣传

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 城市推介会和地方旅游推荐是城市形象宣传的重要组成部分,通过有效的媒体宣传可以提升城市的知名度和吸引力。: 一,活动内容层面: 突出亮点…

Jenkins CI/CD 持续集成专题四 Jenkins服务器IP更换

一、查看brew 的 services brew services list 二、编辑 homebrew.mxcl.jenkins-lts.plist 将下面的httpListenAddress值修改为自己的ip 服务器,这里我是用的本机的ip 三 、重新启动 jenkins-lts brew services restart jenkins-lts 四 、浏览器访问 http://10.…

【Django】初识Django快速上手

Django简介 Django是一个高级的、开源的Python Web框架,旨在快速、高效地开发高质量的Web应用程序 https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Django/Introduction 安装Django pip install Django如果要知道安装的Django的版本,可…

鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源?

官方基本概念 从系统的角度看,进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它进程运行。 OpenHarmony内核的进程模块可以给用户提供多个进程,实现了进程之间的切换和通信,帮助用户管理业务程序…

yolov8旋转目标检测输出的角度转化为适合机械爪抓取的角度

1. 机械爪抓取时旋转的角度定义 以X轴正方向(右)为零度方向,角度取值范围[-90,90)。 确认角度的方法: 逆时针旋转X轴,X轴碰到矩形框长边时旋转过的角度记为angleX: 1.如果angleX小于90&#xf…

【源码】IM即时通讯源码/H5聊天软件/视频通话+语音通话/带文字部署教程

【源码介绍】 IM即时通讯源码/H5聊天软件/视频通话语音通话/带文字部署教程 【源码说明】 测试环境:Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6,根目录public,伪静态laravel5,根据情况开启SSL 登录后台看到很熟悉。。原来是…

docker容器技术篇:集群管理实战mesos+zookeeper+marathon(二)

docker集群管理实战mesoszookeepermarathon(二) 一 实验环境 操作系统:centos7.9 二 基础环境配置以及安装mesos 安装过程请点击下面的链接查看: 容器集群管理实战mesoszookeepermarathon(一) 三 安装…

STM32进入睡眠模式的方法

#STM32进入睡眠模式的方法 今天学习了如何控制STM32进入睡眠模式,进入睡眠模式的好处就是省电,今天学习的只是浅度睡眠,通过中断就能唤醒。比如单片机在那一放,也许好几天好几个月都不用一次,整天的在那空跑while循环…

Git重修系列 ------ Git的使用和常用命令总结

一、Git的安装和配置 git安装: Git - Downloads git首次配置用户信息: $ git config --global user.name "kequan" $ git config --global user.email kequanchanqq.com $ git config --global credential store 配置 Git 以使用本地存储机…

鸿蒙OpenHarmony【小型系统 编译】(基于Hi3516开发板)

编译 OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式,build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。 使用build.sh脚本编译源码 进入源码根目录,执行如下命令进行版本编译。 ./build.sh --product-name name --ccache 说明&…

刷机维修进阶教程---开机定屏 红字感叹号报错 写字库保资料 救砖 刷官方包保资料的步骤方法解析

在维修各种机型 中经常会遇到开机定屏 进不去系统,正常使用无故定屏进不去系统或者更新降级开机红色感叹号的一些故障机。但顾客需要报资料救砖的要求,遇到这种情况。我们首先要确定故障机型的缘由。是摔 还是更新降级 还是无故使用重启定屏等等。根据原因来对症解决。 通过…

Tiny11作者开源:利用微软官方镜像制作独属于你的Tiny11镜像

微软对Windows 11的最低硬件要求包括至少4GB的内存、双核处理器和64GB的SSD存储。然而,这些基本要求仅仅能保证用户启动和运行系统,而非流畅使用 为了提升体验,不少用户选择通过精简系统来减轻硬件负担,我们熟知的Tiny11便是其中…

Typora for Mac:轻量级Markdown编辑器

Typora for Mac是一款专为Mac用户设计的轻量级Markdown编辑器,它以其简洁的界面和强大的功能,成为了Markdown写作爱好者的首选工具。 Typora for Mac v1.8.10中文激活版下载 Typora的最大特色在于其所见即所得的编辑模式,用户无需关心复杂的M…

(七)Servlet教程——Idea编辑器集成Tomcat

1. 点击桌面上Idea快捷方式打开Idea编辑器,假如没有创建项目的话打开Idea编辑器后的界面展示如下图所示 2. 点击界面左侧菜单中的自定义 3. 然后点击界面中的“所有设置...”,然后点击“构建、执行、部署”,选择其中的“应用程序服务器” 4. 点击“”按钮…

Centos之yum安装好玩的命令

1.会动的小火车 我在root下使用的 yum install sl.x86_64sl2.figlet yum install figlet.x86_64figlet 55553.cowsay会说话 yum install cowsay

前端HTML5学习2(新增多媒体标签,H5的兼容性处理)

前端HTML5学习2新增多媒体标签,H5的兼容性处理) 分清标签和属性新增多媒体标签新增视频标签新增音频标签新增全局属性 H5的兼容性处理 分清标签和属性 标签(HTML元素)和属性,标签定义了内容的类型或结构,而…