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 中,私有属性和普通属性(也称为公共属性)有以下区别与联系:
区别:
-
访问权限:
- 公共属性可以在类的内部和外部自由访问和修改。
- 私有属性在类的外部不能直接访问和修改,只能通过类内部定义的方法来间接操作。
-
命名约定:
- 公共属性通常使用普通的变量命名方式。
- 私有属性以双下划线
__
开头。
-
设计意图:
- 公共属性通常用于表示类与外部交互的接口或状态,是类希望暴露给外部使用的信息。
- 私有属性用于实现类的内部细节,隐藏类的实现逻辑,以保持类的封装性和稳定性。
联系:
-
存储方式:无论是私有属性还是公共属性,都存储在类的实例对象中。
-
作用范围:都在类的定义范围内有意义,用于描述类的特征和状态。
-
语法定义:都是通过在类的方法(包括
__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
等公共方法来控制对余额的操作和获取。
这样做的好处有:
- 保护数据的完整性和一致性:避免外部代码直接修改数据导致错误或不一致的状态。
- 隐藏实现细节:外部代码不需要知道数据是如何存储和管理的,只需要通过公共接口进行操作。
- 提高代码的可维护性和可扩展性:如果数据的存储或操作方式发生变化,只需要修改类内部的实现,而不会影响外部使用该类的代码。
相关文章:
python的私有属性和数据封装
1.私有属性 在 Python 中,私有属性是一种编程约定,用于表示某些属性在类的内部使用,不希望被外部直接访问或修改。 私有属性的命名通常以双下划线 __ 开头。例如,在类中定义一个私有属性可以像这样: class MyClass:de…...
一文学会鉴别“套壳”ChatGPT模型
一文学会鉴别“套壳”ChatGPT模型 随着ChatGPT等明星模型的诞生,市场上也开始出现一些“套壳”现象,即部分模型表面标榜原创或先进,实则在核心算法上与知名模型高度相似。作为技术探索者,如何拨开迷雾,识别这些“李鬼…...

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

python-28-零基础自学python-json存数据、读数据,及程序合并
学习内容:《python编程:从入门到实践》第二版 知识点: import json引入、 try-except-else return def函数、打开文件、 练习内容: 练习10-11:喜欢的数 编写一个程序,提示用户输入喜欢的数ÿ…...

Excel第30享:基于辅助列的条件求和
1、需求描述 如下图所示,现要统计2022年YTD(Year To Date:年初至今日)各个人员的“上班工时(a2)”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 Step1:确定逻辑。“从日期中提取出…...
Java查看RSA密钥的ASN1结构
背景:服务端使用Java开发的,接口需要客户端传一个RSA公钥,手机端使用Flutter开发的,然后就选择使用 pointycastle 生成密钥,很不巧,dart版本不像Java一样有个可以直接获取编码过的公钥信息的方法࿱…...

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板
导读 维持实时视频系统软硬件的长期成本效益,是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题,提供高带宽且高可靠性的端到端网络链接,有效降低了开发成本、复杂性和时间。 引言 虽然实…...
网络安全策略:优先防护而非溯源的重要性
面对网络攻击,企业往往面临一个关键决策点:是立即投入资源进行攻击溯源,还是优先加强自身的防御体系。尽管溯源分析有助于了解攻击者的手段和动机,但在大多数情况下,优先强化防护是更为明智的选择。本文将探讨为何在遭…...
ES6 Iterator 与 for...of 循环(五)
Iterator 特性: 统一的接口:无论是数组、字符串还是自定义对象,只要它们有默认的迭代器,就可以使用 for…of 循环进行遍历。可迭代对象:具有 [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零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

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

Python | Leetcode Python题解之第227题基本计算器II
题目: 题解: 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语言实现的,c语言中是自带字符串的,但是为什么redis还要再实现自己的动态字符串呢,这种动态字符串的底层数据结构是怎样的呢?接下来我们带着这些问题来看一看redis中的动态字符串sds。 2.sds的组成 struct __at…...
路由协议的优先级,以及管理距离 AD 和 metric 的区别
路由协议的优先级(Preference,即管理距离 Administrative Distance )一般为一个 0 到 255 之间的数字,数字越大则优先级越低。表一是通常情况下各路由协议的优先级规定: 表一:一般路由协议优先级 路由协议…...

力扣 24两两交换链表中节点
画图 注意有虚拟头结点 注意判断时先判断cur->next ! nullptr,再判断cur->next->next ! nullptr 注意末尾返回dumyhead->next,用新建result指针来接并返回 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode *dummyhead new …...

C# + halcon 联合编程示例
C# halcon 联合编程示例 实现功能 1.加载图像 2.画直线,画圆,画矩形, 画椭圆 ROI,可以调整大小和位置 3.实现找边,找圆功能 效果 开发环境 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操作:将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作:…...

Aop切面编程(2)--代理模式
1、代理模式的理解:不修改A对象的代码的基础上,对A代码块进行拓展。通过创建ProxyA代理对象,拓展A对象并调用A对象的核心功能; 即:不修改对象的源码基础上,创建代理对象,进行功能的附加和增强&…...
Spring Boot(八十):Tesseract实现图片文字自动识别
1Tesseract 要实现图片转文字(OCR,Optical Character Recognition)功能,可以使用一些现有的OCR库,比如Google的Tesseract或者百度AI、阿里云OCR等云服务。 下面以Tesseract为例: Tesseract是一个开源文本识别 (OCR)引擎,是目前公认最优秀、最精确的开源OCR系统,用于…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...