当前位置: 首页 > news >正文

python的私有属性和数据封装

1.私有属性

在 Python 中,私有属性是一种编程约定,用于表示某些属性在类的内部使用,不希望被外部直接访问或修改。

私有属性的命名通常以双下划线 __ 开头。例如,在类中定义一个私有属性可以像这样:

class MyClass:def __init__(self):self.__private_attribute = 42

虽然在 Python 中实际上没有严格的访问限制(不像一些其他编程语言),但使用双下划线开头的命名约定向其他开发者表明这些属性是私有的,不应该在类的外部直接访问或修改。

如果在类的外部尝试直接访问私有属性,会引发属性错误。但是,Python 会通过一种称为名称重整(Name Mangling)的机制来处理私有属性的名称。实际上,私有属性会被重命名为 _ClassName__private_attribute 的形式。

然而,不建议通过这种方式来访问或修改私有属性,因为这违背了封装的原则。

封装的目的是将数据和操作数据的方法封装在一个类中,只通过公共方法来提供对外的接口,以控制对数据的访问和修改,提高代码的可维护性和可扩展性。

例如,应该通过定义公共方法来获取或设置私有属性的值:

class MyClass:def __init__(self):self.__private_attribute = 42def get_private_attribute(self):return self.__private_attributedef set_private_attribute(self, value):self.__private_attribute = value

这样可以在公共方法中添加额外的逻辑,比如数据验证等。 

2.私有属性和普通属性

在 Python 中,私有属性和普通属性(也称为公共属性)有以下区别与联系:

区别

  1. 访问权限:

    • 公共属性可以在类的内部和外部自由访问和修改。
    • 私有属性在类的外部不能直接访问和修改,只能通过类内部定义的方法来间接操作。
  2. 命名约定:

    • 公共属性通常使用普通的变量命名方式。
    • 私有属性以双下划线 __ 开头。
  3. 设计意图:

    • 公共属性通常用于表示类与外部交互的接口或状态,是类希望暴露给外部使用的信息。
    • 私有属性用于实现类的内部细节,隐藏类的实现逻辑,以保持类的封装性和稳定性。

联系

  1. 存储方式:无论是私有属性还是公共属性,都存储在类的实例对象中。

  2. 作用范围:都在类的定义范围内有意义,用于描述类的特征和状态。

  3. 语法定义:都是通过在类的方法(包括 __init__ 方法)中进行赋值来初始化的。

例如,考虑以下类的定义:

class Person:def __init__(self):self.name = "Alice"  # 公共属性self.__age = 25  # 私有属性def get_age(self):return self.__agedef set_age(self, age):if age >= 0:self.__age = age

在这个例子中,name 是公共属性,可以在类的外部直接访问和修改,如 person = Person(); print(person.name) 。而 __age 是私有属性,直接访问 person.__age 会引发错误,应该通过 get_age 和 set_age 方法来操作。

总的来说,私有属性和公共属性都是类的属性,用于描述类的状态,但私有属性提供了更严格的访问控制,有助于实现良好的封装和代码设计。

3.数据封装

在 Python 中,数据封装是面向对象编程的一个重要概念。

数据封装指的是将数据(属性)和对数据进行操作的方法(函数)包装在一个类中,隐藏数据的实现细节,只通过定义好的公共接口(方法)来访问和操作数据。

封装的概念主要对应于私有属性,但不仅仅局限于私有属性。

私有属性是封装的一种具体实现方式。通过将属性定义为私有,限制了外部直接访问和修改,强制外部通过类提供的公共方法来操作数据,从而更好地隐藏了类的内部实现细节,体现了封装的原则。

然而,公共属性也可以是封装的一部分。公共属性可以作为类与外部世界交互的接口,但其访问和修改也应该遵循一定的规则和逻辑,这些规则和逻辑通常通过类中的方法来实现和控制。

例如,一个类可能有一个公共属性表示对象的状态,但对该属性的修改可能需要在特定条件下进行,这些条件就可以在类的方法中进行判断和处理。

总的来说,封装强调的是将数据和操作数据的方法组合在一起,并控制对数据的访问和修改,私有属性在实现这种控制方面起到了重要作用,但公共属性的合理使用和管理也是封装的一部分。

以下是一个简单的数据封装示例:

class BankAccount:def __init__(self, balance=0):self.__balance = balance  # 私有属性,表示账户余额def deposit(self, amount):  # 存款方法if amount > 0:self.__balance += amountprint(f"成功存入 {amount} 元,当前余额为 {self.__balance} 元")else:print("存款金额必须大于 0")def withdraw(self, amount):  # 取款方法if 0 < amount <= self.__balance:self.__balance -= amountprint(f"成功取出 {amount} 元,当前余额为 {self.__balance} 元")elif amount <= 0:print("取款金额必须大于 0")else:print("余额不足")def get_balance(self):  # 获取余额方法return self.__balance

在上述 BankAccount 类中:

  • __balance 是私有属性,外部代码不能直接访问和修改它。
  • 通过 deposit 、withdraw 和 get_balance 等公共方法来控制对余额的操作和获取。

这样做的好处有:

  1. 保护数据的完整性和一致性:避免外部代码直接修改数据导致错误或不一致的状态。
  2. 隐藏实现细节:外部代码不需要知道数据是如何存储和管理的,只需要通过公共接口进行操作。
  3. 提高代码的可维护性和可扩展性:如果数据的存储或操作方式发生变化,只需要修改类内部的实现,而不会影响外部使用该类的代码。

 

 

 

相关文章:

python的私有属性和数据封装

1.私有属性 在 Python 中&#xff0c;私有属性是一种编程约定&#xff0c;用于表示某些属性在类的内部使用&#xff0c;不希望被外部直接访问或修改。 私有属性的命名通常以双下划线 __ 开头。例如&#xff0c;在类中定义一个私有属性可以像这样&#xff1a; class MyClass:de…...

一文学会鉴别“套壳”ChatGPT模型

一文学会鉴别“套壳”ChatGPT模型 随着ChatGPT等明星模型的诞生&#xff0c;市场上也开始出现一些“套壳”现象&#xff0c;即部分模型表面标榜原创或先进&#xff0c;实则在核心算法上与知名模型高度相似。作为技术探索者&#xff0c;如何拨开迷雾&#xff0c;识别这些“李鬼…...

Docker基本管理1

Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自…...

python-28-零基础自学python-json存数据、读数据,及程序合并

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; import json引入、 try-except-else return def函数、打开文件、 练习内容&#xff1a; 练习10-11&#xff1a;喜欢的数 编写一个程序&#xff0c;提示用户输入喜欢的数&#xff…...

Excel第30享:基于辅助列的条件求和

1、需求描述 如下图所示&#xff0c;现要统计2022年YTD&#xff08;Year To Date&#xff1a;年初至今日&#xff09;各个人员的“上班工时&#xff08;a2&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 Step1&#xff1a;确定逻辑。“从日期中提取出…...

Java查看RSA密钥的ASN1结构

背景&#xff1a;服务端使用Java开发的&#xff0c;接口需要客户端传一个RSA公钥&#xff0c;手机端使用Flutter开发的&#xff0c;然后就选择使用 pointycastle 生成密钥&#xff0c;很不巧&#xff0c;dart版本不像Java一样有个可以直接获取编码过的公钥信息的方法&#xff1…...

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板

导读 维持实时视频系统软硬件的长期成本效益&#xff0c;是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题&#xff0c;提供高带宽且高可靠性的端到端网络链接&#xff0c;有效降低了开发成本、复杂性和时间。 引言 虽然实…...

网络安全策略:优先防护而非溯源的重要性

面对网络攻击&#xff0c;企业往往面临一个关键决策点&#xff1a;是立即投入资源进行攻击溯源&#xff0c;还是优先加强自身的防御体系。尽管溯源分析有助于了解攻击者的手段和动机&#xff0c;但在大多数情况下&#xff0c;优先强化防护是更为明智的选择。本文将探讨为何在遭…...

ES6 Iterator 与 for...of 循环(五)

Iterator 特性&#xff1a; 统一的接口&#xff1a;无论是数组、字符串还是自定义对象&#xff0c;只要它们有默认的迭代器&#xff0c;就可以使用 for…of 循环进行遍历。可迭代对象&#xff1a;具有 [Symbol.iterator] 属性的对象被认为是可迭代的。[Symbol.iterator] 是一个…...

typora删除多余图片

import os import re import shutil from bs4 import BeautifulSoupimport warningswarnings.filterwarnings(ignore) # 定义正则表达式用于匹配.md文件中的图片引用语句 pattern re.compile(r!\[.*]\((.*)\))# 获取所有.md文件中的图片引用路径 references set() md_filepat…...

【ceph】ceph-mon重新选举的情况

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

PopClip(Mac 划词增强工具)值得购买吗?

PopClip 是一款 Mac 划词操作增强工具&#xff0c;可选装翻译搜索、格式转换等丰富扩展&#xff0c;联动多种软件执行创建提醒事项、添加到笔记等快捷操作&#xff0c;有效提升工作效率。 在 iPhone 或 iPad 内&#xff0c;选词后就会弹出气泡菜单&#xff0c;让你选择执行各种…...

Python | Leetcode Python题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; class Solution:def calculate(self, s: str) -> int:n len(s)stack []preSign num 0for i in range(n):if s[i] ! and s[i].isdigit():num num * 10 ord(s[i]) - ord(0)if i n - 1 or s[i] in -*/:if preSign :stack.append(…...

redis源码分析之底层数据结构(一)-动态字符串sds

1.绪论 我们知道redis是由c语言实现的&#xff0c;c语言中是自带字符串的&#xff0c;但是为什么redis还要再实现自己的动态字符串呢&#xff0c;这种动态字符串的底层数据结构是怎样的呢?接下来我们带着这些问题来看一看redis中的动态字符串sds。 2.sds的组成 struct __at…...

路由协议的优先级,以及管理距离 AD 和 metric 的区别

路由协议的优先级&#xff08;Preference&#xff0c;即管理距离 Administrative Distance &#xff09;一般为一个 0 到 255 之间的数字&#xff0c;数字越大则优先级越低。表一是通常情况下各路由协议的优先级规定&#xff1a; 表一&#xff1a;一般路由协议优先级 路由协议…...

力扣 24两两交换链表中节点

画图 注意有虚拟头结点 注意判断时先判断cur->next ! nullptr,再判断cur->next->next ! nullptr 注意末尾返回dumyhead->next&#xff0c;用新建result指针来接并返回 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode *dummyhead new …...

C# + halcon 联合编程示例

C# halcon 联合编程示例 实现功能 1.加载图像 2.画直线&#xff0c;画圆&#xff0c;画矩形, 画椭圆 ROI&#xff0c;可以调整大小和位置 3.实现找边&#xff0c;找圆功能 效果 开发环境 Visual Studio 2022 .NET Framework 4.8 halcondotnet.dll 查看帮助文档 项目结构 DL…...

【Git基本操作】添加文件 | 修改文件 | 及其各场景下.git目录树的变化

目录 1. 添加文件&add操作和commit操作 2. .git树状目录的变化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作&#xff1a;将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作&#xff1a;…...

Aop切面编程(2)--代理模式

1、代理模式的理解&#xff1a;不修改A对象的代码的基础上&#xff0c;对A代码块进行拓展。通过创建ProxyA代理对象&#xff0c;拓展A对象并调用A对象的核心功能&#xff1b; 即&#xff1a;不修改对象的源码基础上&#xff0c;创建代理对象&#xff0c;进行功能的附加和增强&…...

Spring Boot(八十):Tesseract实现图片文字自动识别

1Tesseract 要实现图片转文字(OCR,Optical Character Recognition)功能,可以使用一些现有的OCR库,比如Google的Tesseract或者百度AI、阿里云OCR等云服务。 下面以Tesseract为例: Tesseract是一个开源文本识别 (OCR)引擎,是目前公认最优秀、最精确的开源OCR系统,用于…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...