当前位置: 首页 > 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系统,用于…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...