python私有化get和set的使用

私有化的好处

  1. 封装性:私有化有助于实现良好的封装,这是面向对象编程的核心原则之一。通过隐藏类的内部实现细节,可以减少外部对类的内部状态的直接访问和修改,从而保护对象的状态。

  2. 接口稳定性:私有化可以使得类的接口更加稳定。当类的实现细节被隐藏时,类的使用者不需要关心这些细节,因此即使内部实现发生变化,只要外部接口保持不变,使用者的代码就不需要修改。

  3. 避免命名冲突:使用私有属性或方法可以避免在不同模块或类之间发生命名冲突,因为私有成员只在定义它们的类内部可见。

  4. 提高代码可读性:私有化可以提高代码的可读性。通过使用下划线前缀,开发者可以清楚地知道哪些属性和方法是类的内部实现细节,不应该被外部直接访问。

  5. 减少错误:限制对内部状态的直接访问可以减少由于不当操作导致的程序错误。例如,如果一个属性需要经过特定的计算或验证才能被设置,那么通过私有化并提供一个公共的方法来设置这个属性,可以确保每次设置都是有效的。

  6. 灵活性:私有化提供了更大的灵活性来改变类的内部实现,而不影响使用该类的代码。开发者可以在不影响外部代码的情况下重构类的内部结构。

  7. 维护性:良好的封装和私有化可以使得类的维护更加容易。当类的内部实现被隐藏起来时,维护者可以专注于类的内部逻辑,而不需要担心这些变化如何影响类的使用者。

  8. 安全性:在某些情况下,私有化可以提高代码的安全性。例如,如果一个类管理着敏感数据,通过私有化可以防止外部代码直接访问这些数据。

class BankAccount:def __init__(self, owner, balance=0):# 初始化账户所有者和余额self.owner = owner# 私有属性,外部无法直接访问self.__balance = balancedef deposit(self, amount):"""存款方法:param amount: 存入金额,必须大于0"""if amount > 0:self.__balance += amount  # 增加余额print(f"Deposited {amount}. New balance is {self.__balance}.")else:print("Deposit amount must be positive.")def withdraw(self, amount):"""取款方法:param amount: 取出金额,必须大于0"""if amount > 0:if amount <= self.__balance:  # 检查余额是否充足self.__balance -= amount  # 减少余额print(f"Withdrew {amount}. Remaining balance is {self.__balance}.")else:print("Insufficient funds.")else:print("Withdrawal amount must be positive.")def get_balance(self):"""获取当前余额:return: 当前余额"""print(f"The current balance is {self.__balance}.")return self.__balancedef __transfer(self, other, amount):"""私有方法,用于在两个账户之间转账:param other: 另一个账户对象:param amount: 转账金额,必须大于0"""if amount > 0:if amount <= self.__balance:  # 检查余额是否充足self.__balance -= amount  # 减少当前账户余额other.deposit(amount)  # 增加另一个账户余额print(f"Transferred {amount} to {other.owner}.")else:print("Insufficient funds for transfer.")else:print("Transfer amount must be positive.")# 使用BankAccount类
account1 = BankAccount("Alice", 1000)
account2 = BankAccount("Bob", 500)# 存钱
account1.deposit(200)# 取钱
account1.withdraw(500)# 打印余额
account1.get_balance()# 尝试直接访问私有属性(会引发错误)
# print(account1.__balance)# 尝试直接调用私有方法(会引发错误)
# account1.__transfer(account2, 300)# 正确的转账方式
account1._BankAccount__transfer(account2, 200)  # 通过名称修饰来访问私有方法
account1.get_balance()
account2.get_balance()
'''
__balance 是一个私有属性,它通过双下划线前缀表示。在类外部,你不能直接访问这个属性,尝试这样做会引发AttributeError。
__transfer 是一个私有方法,它同样通过双下划线前缀表示。这个私有方法只能在类内部被调用,外部代码不能直接调用它。但是,如果你确实需要从类外部调用私有方法,可以通过名称修饰(_ClassName__MethodName)来访问。
get_balance 是一个公共方法,用于获取当前账户的余额。这是一个封装的示例,它提供了一个安全的方式来访问私有属性。
'''

get和set

在私有化过程中,getset方法是用于访问和修改私有属性的重要机制,以下是详细介绍:

1. 概念

  • get方法(访问器方法):用于获取私有属性的值,它提供了一种对外公开的方式来读取对象内部的私有数据。
  • set方法(修改器方法):用于设置私有属性的值,通过它可以在赋值时进行一些额外的逻辑处理,如数据验证等,然后再更新私有属性。

2. 作用

  • 数据封装和隐藏:将类的属性私有化可以防止外部直接访问和修改,保证数据的安全性和完整性。通过getset方法来控制对属性的访问,使得类的内部实现细节对外部不可见,外部只能通过规定的方法来操作数据,这就是数据封装的体现。
  • 数据验证和约束:在set方法中,可以添加代码来验证即将设置的值是否符合特定的规则或约束条件。例如,确保一个表示年龄的属性值在合理范围内(如0到120之间),如果不符合规则则不进行赋值操作,或者进行一些默认处理,从而保证数据的有效性。
  • 灵活的属性访问控制:可以根据需要在getset方法中添加额外的逻辑。比如,在get方法中可以根据某些条件返回不同格式或经过计算的值;在set方法中可以记录属性值的修改历史等,从而实现更灵活的属性访问控制。

3. 实现示例(以Python为例)

class Person:def __init__(self, name, age):self.__name = name  # 私有属性,姓名self.__age = age    # 私有属性,年龄# 获取姓名的get方法def get_name(self):return self.__name# 设置姓名的set方法def set_name(self, new_name):if isinstance(new_name, str) and len(new_name) > 0:self.__name = new_nameelse:print("姓名必须是有效的字符串。")# 获取年龄的get方法def get_age(self):return self.__age# 设置年龄的set方法def set_age(self, new_age):if isinstance(new_age, int) and 0 <= new_age <= 120:self.__age = new_ageelse:print("年龄必须是0到120之间的整数。")

4. 注意事项

  • 命名规范:虽然不同编程语言对于getset方法的命名可能没有严格的强制规定,但遵循一定的命名约定有助于提高代码的可读性。例如,在Java中,get方法通常命名为getPropertyNameset方法命名为setPropertyName(其中PropertyName是属性的名称,采用大写字母开头的驼峰命名法);在Python中,通常使用get_property_nameset_property_name的形式(采用小写字母开头,单词之间用下划线分隔的命名方式)。
  • 不要过度使用:在一些简单的场景中,如果属性的访问和修改逻辑非常简单,直接将属性公开可能更直观和方便,过度使用getset方法会增加代码的复杂性。但在涉及到数据封装、验证等重要需求时,使用getset方法是更好的选择。
  • 性能考虑(在某些语言中):在一些对性能要求极高的场景下,频繁调用getset方法可能会带来一定的性能开销,因为方法调用涉及到额外的栈操作等。但在大多数普通应用场景中,这种性能影响通常可以忽略不计,并且现代编译器和解释器在优化方面也在不断改进。不过,如果确实在性能关键部分发现getset方法成为性能瓶颈,可以考虑进行针对性的优化,如内联函数等(具体取决于编程语言是否支持及如何实现)。

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

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

相关文章

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述 1.1 MQTT协议是什么 MQTT : Message Queuing Telemetry Transport 模式 : 发布 / 订阅主题优点 : 代码量小、低带宽、实时可靠应用 : 物联网、小型设备、移动应用MQTT 常用端口 : 1883 MQTT是一个网络协议&#xff0c;和HTTP类似&#xff0c;因为轻量简单&…

鸿蒙HarmonyOS 网络请求获取数据Http

注意的是;要为接口返回值指定类型 &#xff0c;以及定义接口数据类型 index.ets import { http } from kit.NetworkKit;interface createAtType {date: number,}interface dataListType {createAt: createAtType;imgUrl: }Component export default struct TabBar {State dat…

2024136读书笔记|《飞鸟集》——使生如夏花之绚烂,死如秋叶之静美

2024136读书笔记|《飞鸟集》——使生如夏花之绚烂&#xff0c;死如秋叶之静美 《飞鸟集》[印]泰戈尔&#xff0c;一本有意思的诗集&#xff0c;中英文对照着读更有意思。“你是谁&#xff0c;读者&#xff0c;百年后读着我的诗&#xff1f;”让我觉得有些久别重逢&#xff0c;忽…

ROS Action

在 ROS 中&#xff0c;Action 是一种支持长时间异步任务的通信机制。与 Service 不同&#xff0c;Action 允许客户端发起一个请求&#xff0c;并在任务执行的过程中不断接收反馈&#xff0c;直到任务完成。这种机制非常适用于可能需要较长时间来完成的任务&#xff0c;比如机器…

约束(MYSQL)

not null&#xff08;非空&#xff09; unique&#xff08;唯一&#xff09; default&#xff08;默认约束&#xff0c;规定值&#xff09; 主键约束primary key&#xff08;非空且唯一&#xff09; auto_increment&#xff08;自增类型&#xff09; 复合主键 check&#xff08…

笔记 | image may have poor performance,or fail,if run via emulation

在Docker Desktop中现象如图&#xff1a; 当你运行 AMD64 平台代码时&#xff08;Intel 和 AMD 芯&#xff09;&#xff0c;你的 Mac 必须模拟其CPU架构&#xff08;因为你自身是ARM&#xff09;。这通常会非常吃性能。 Docker Desktop 警告你在模拟 Intel/AMD x64 CPU 时性能可…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C 个人主页&#xff1a;Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

24/11/7 算法笔记 PCA主成分分析

假如我们的数据集是n维的&#xff0c;共有m个数据(x,x,...,x)。我们希望将这m个数据的维度从n维降到k维&#xff0c;希望这m个k维的数据集尽可能的代表原始数据集。我们知道数据从n维降到k维肯定会有损失&#xff0c;但是我们希望损失尽可能的小。那么如何让这k维的数据尽可能表…

JS 实现SSE通讯和了解SSE通讯

SSE 介绍&#xff1a; Server-Sent Events&#xff08;SSE&#xff09;是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比&#xff0c;SSE提供了更高效和实时的数据推送机制。 SSE基于HTTP协议&#xff0c;允许服务器将数据以事件流&#xff08;…

C/C++每日一练:查找链表的中间节点

链表&#xff08;Linked List&#xff09; 链表是一种线性数据结构&#xff0c;由一系列节点&#xff08;Node&#xff09;通过指针链接在一起。与数组不同&#xff0c;链表中的元素在内存中不需要连续存储&#xff0c;每个节点包含两部分&#xff1a; 数据部分&#xff1a;存…

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密&#xff1a;密码学的基石及 RSA 算法详解 在当今数字化的时代&#xff0c;信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术&#xff0c;为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…

PH47代码框架全局函数及功能类

PH47代码框架全局函数及功能类 概述 全局函数及功能类体系是PH47框架当中除了4个逻辑层之外最重要的组成部分之一&#xff0c;它们可以在 整个PH7 代码框架及用户代码中使用。常用全局函数及功能类为 PH7 代码框架提供了最常用和最基础的功能实现。 全局函数主要包含了对时间…

力扣 LeetCode 203. 移除链表元素(Day2:链表)

解题思路&#xff1a; 方法一&#xff1a;头节点和非头节点分开处理 方法二&#xff1a;定义一个dummy虚拟节点&#xff0c;后面的节点就可以采用相同的处理方式 注意&#xff1a; cur需要指向要删除的节点的上一个节点&#xff0c;因为要越过这一个被删除的节点 class Sol…

IEC60870-5-104 协议源码架构详细分析

IEC60870-5-104 协议源码架构 前言一、资源三、目录层级一二、目录层级二config/lib60870_config.hdependencies/READMEexamplesCMakeLists.txtcs101_master_balancedcs104_client_asyncmulti_client_servertls_clienttls_server说明 make这些文件的作用是否需要导入这些文件&a…

turbo c 2.0 画螺栓

代码; #include<graphics.h> void bolt(x0,y0,d,l) int x0,y0,d,l; {int x1,x2,x3,x4,x5,x6,x7,x8;int y1,y2,y3,y4,y5,r1,r2,b,c;if(l>2*d) b2*d;else b1;r11.5*d;r20.38*d;c0.1*d;x1x0-0.7*d;x2x0-0.61*d;x3x0-0.32*d;x4x00.8*d;x5x0l-b;x6x0l-c;x7x0l-0.05*d;x8x0…

网络服务综合项目-博客

一、运行环境&#xff1a; 主机主机名系统服务192.168.31.128Server-WebLinuxWeb192.168.31.129Server-NFS-DNSLinuxNFS 二、基础配置&#xff1a; 配置主机名开启防火墙并配置部分开启selinux并配置服务器之间使用ntp.aliyun.com进行时间同步服务器之间实现ssh免密登录 三…

leetcode86:分隔链表

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&am…

Android Mobile Network Settings | APN 菜单加载异常

问题 从log看是有创建APN对应的Controller&#xff08;功能逻辑是ok的&#xff09;&#xff0c;但是Mobile Network Settings无法显示&#xff08;UI异常&#xff09;。 日志分析 看似APN 菜单已经创建了&#xff0c;实际上并没有显示。 11-12 07:01:28.150 8773 8773 D Pr…

上海市计算机学会竞赛平台2020年4月月赛丙组永恒的生命游戏

题目背景 2020年4月11日&#xff0c;英国数学家 约翰霍顿康威&#xff08;John Horton Conway&#xff09;因为新型冠状病毒肺炎不幸逝世。他在群论、数论、代数、几何拓扑、理论物理、组合博弈论和几何等领域&#xff0c;都做出了重大贡献。他的离去是人类文明的损失。他最著…

FS8x 功能安全

fail-safe是电独立的和物理隔离的。fail-safe由自己的参考电压和电流提供,有自己的振荡器,有重复的模拟路径以最小化常见的故障,并有LBIST/ABIST来覆盖潜在故障。fail-safe根据设备部件号提供ASIL B或ASIL D遵从性。除非另有规定,fail-safe定时来自故障安全振荡器,其精度为…