Python 面向对象——6.封装

news2024/11/20 16:28:40

本章学习链接如下:

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 += amount
        print(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.coloradmin.cn/o/1628990.html

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

相关文章

cJSON的使用

文章目录 一、CJSON初识二、CJSON解析器基础三、CJSON解析数据JSON解析基础CJSON解析数组数据CJSON解析嵌套数据 五、创建JSON数据 一、CJSON初识 JSON (JavaScript Object Notation)是一种轻量级的数据交换格式,常用于在网络之间传输数据。它是一种文本格式&#…

OpenCV C++实现区域面积筛选以及统计区域个数

目录 1、背景介绍 2、代码实现 2.1 获取原图 2.1.1 区域图像imread 2.1.2 具体实现 2.2 获取图像大小 2.3 阈值分割 2.3.1 阈值分割threshold 2.3.2 具体实现 2.4 区域面积筛选 2.4.1 获取轮廓findContours 2.4.2 获取轮廓面积contourArea 2.4.3 填充区域fil…

JEECG/SpringBoot集成flowable流程框架

IDEA安装Flowable BPMN visualizer插件 pom.xml中引入flowable相关依赖 <dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.7.2</version></dependency><depe…

kotlin 编写一个简单的天气预报app (七)使用material design

一、优化思路 对之前的天气预报的app进行了优化&#xff0c;原先的天气预报程序逻辑是这样的。 使用text和button组合了一个输入城市&#xff0c;并请求openweathermap对应数据&#xff0c;并显示的功能。 但是搜索城市的时候&#xff0c;可能会有错误&#xff0c;比如大小写…

SpringBoot项目启动,传参有哪些方式?

SpringBoot项目启动&#xff0c;传参有哪些方式&#xff1f; 1.Spring级别的参数 直接在启动 Spring Boot 应用的命令行中使用 -- 后跟参数名和值的方式来传递参数。 记住&#xff1a;一般是对于Spring Boot应用特有的配置参数&#xff0c;确保它们遵循Spring Boot的配置属性命…

Mediasoup-demo 本地启动步骤(超详细)

Mediasoup-demo 本地启动步骤&#xff08;超详细&#xff09; 一.本人环境 系统&#xff1a;macos13.6.3 node: v16.20.2 npm:8.19.4 python: 3.9.6 二.下载代码 git 下载代码&#xff1a; git clone gitgithub.com:versatica/mediasoup-demo.git 三.代码介绍 下载下来…

电磁仿真--基本操作-CST-(4)

目录 1. 简介 2. 建模过程 2.1 基本的仿真配置 2.2 构建两个圆环体和旋转轴 2.3 切分圆环体 2.4 衔接内外环 2.5 保留衔接部分 2.6 绘制内螺旋 2.7 绘制外螺旋 2.8 查看完整体 2.9 绘制引脚 2.10 设置端口 2.11 仿真结果 3. 使用Digilent AD2进行测试 3.1 进行…

十、多模态大语言模型(MLLM)

1 多模态大语言模型&#xff08;Multimodal Large Language Models&#xff09; 模态的定义 模态&#xff08;modal&#xff09;是事情经历和发生的方式&#xff0c;我们生活在一个由多种模态(Multimodal)信息构成的世界&#xff0c;包括视觉信息、听觉信息、文本信息、嗅觉信…

Java 提取HTML文件中的文本内容

从 HTML 文件中提取文本内容是数据抓取中的一个常见任务&#xff0c;你可以将提取的文本信息用于编制报告、进行数据分析或其他处理。本文分享如何使用免费 Java API 从HTML 文件中提取文本内容。 安装免费Java库&#xff1a; 要通过Java提取HTML文本&#xff0c;需要用到Free…

基于车载点云数据的城市道路特征目标提取与三维重构

作者&#xff1a;邓宇彤&#xff0c;李峰&#xff0c;周思齐等 来源&#xff1a;《北京工业大学学报》 编辑&#xff1a;东岸因为一点人工一点智能公众号 基于车载点云数据的城市道路特征目标提取与三维重构本研究旨在弥补现有研究在处理复杂环境和大数据量上的不足&#xf…

灯塔:MySQL笔记 (1)

数据库相关概念 名称全称简称数据库存储数据的仓库&#xff0c;数据有组织的进行存储DateBase(DB)数据库管理系统操控和管理数据据库的大型软件DateBase Management System (DBSM)SQL操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库——标准Structured Que…

python生成二维码及进度条源代码

一、进度条 1、利用time模块实现 import time for i in range(0, 101, 2):time.sleep(0.3)num i // 2if i 100:process "\r[%3s%% ]: |%-50s|\n" % (i, # * num)else:process "\r[%3s%% ]: |%-50s|" % (i, # * num)print(process, end, flushTrue)2、使…

CentOS/Anolis的Linux系统如何通过VNC登录远程桌面?

综述 需要在server端启动vncserver&#xff0c;推荐tigervnc的server 然后再本地点来启动client进行访问&#xff0c;访问方式是IPport&#xff08;本质是传递数据包到某个ip的某个port&#xff09; 然后需要防火墙开启端口 服务器上&#xff1a;安装和启动服务 安装服务 y…

vivado Aurora 8B/10B IP核(1)

Aurora 8B/10B IP 支持 Kintex -7, Virtex -7 FPGA GTP 和 GTH 收发器&#xff0c;Artix -7 FPGA GTP 收发器, Zynq -7000 GTP and GTP 收发器。Aurora 8B/10B IP core 可以工作于单工或者全双工模式。IP CODE的使用也非常简单&#xff0c;支持 AMBA总线的 AXI4-Stream 协议。…

2024蓝桥杯CTF--逆向

蓝桥杯付费CT--逆向 题目&#xff1a;RC4题目&#xff1a;happytime总结&#xff1a; 题目&#xff1a;RC4 先查壳&#xff0c;无壳&#xff0c;并且是32位&#xff1a; 用32位的ida打开&#xff0c;直接定位到main函数&#xff1a; 重点关注sub_401005函数&#xff0c;这个应…

编程学习系列(1):计算机发展及应用(1)

前言&#xff1a; 最近我在整理书籍时&#xff0c;发现了一些有关于编程的学习资料&#xff0c;我派蒙也不是个吝啬的人&#xff0c;从今天开始就陆续分享给大家。 计算机发展及应用&#xff08;1&#xff09; 1944 年美国数学家冯诺依曼&#xff08;现代计算机之父&#xff…

【Redis 开发】Redis持久化(RDB和AOF)

Redis持久化 RDBAOFRDB和AOF的区别 RDB RDB全称Redis DataBase Backup file &#xff08;Redis数据备份文件&#xff09;&#xff0c;也被称为Redis数据快照&#xff0c;简单来说就是把内存中的所有数据都记录到磁盘中&#xff0c;当Redis实例故障重启后&#xff0c;从磁盘读取…

GPU:使用gpu-burn压测GPU

简介&#xff1a;在测试GPU的性能问题时&#xff0c;通常需要考虑电力和散热问题。使用压力测试工具&#xff0c;可以测试GPU满载时的状态参数&#xff08;如温度等&#xff09;。gpu_burn是一个有效的压力测试工具。通过以下步骤可以进行测试。 官网&#xff1a; http://www…

Xline中区间树实现小结

Table of Contents 实现区间树的起因区间树实现简介 插入/删除查询重叠操作使用Safe Rust实现区间树 问题Rc<RefCell<T>> i. 线程安全问题其他智能指针 i. Arc<Mutex<T>>? ii. QCell数组模拟指针总结 01、实现区间树的起因 在Xline最近的一次重构中…

基于PI控制器的DC-DC结构PWM系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PI控制器的DC-DC结构PWM系统simulink建模与仿真。包括IGBT结构&#xff0c;PI控制器结构&#xff0c;PWM模块等。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MA…