Python中私有属性的定义方式
作者:Daniel2333 发布时间:2023-11-01 16:47:17
标签:Python,私有属性,定义
Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field.
示例代码:
class Vector2D(object):
def __init__(self, x, y):
self.__x = float(x)
self.__y = float(y)
self.xx = x
self.yy = y
def get_x(self):
return self.__x # 内部访问
if __name__ == "__main__":
v = Vector2D(3, 4)
print v.__dict__
print v._Vector2D__x, v.get_x()# 但是可以通过v._Vector2D__x 在外部访问
v.__x # 外部访问
输出:
{'yy': 4, 'xx': 3, '_Vector2D__x': 3.0, '_Vector2D__y': 4.0}
3.0 3.0
Traceback (most recent call last):
...
v.__x
AttributeError: 'Vector2D' object has no attribute '__x'
从上面的例子可以看出:
1. __field被编译器重命名为_className__field
2. 在class外部不能访问obj.__field, 但在class内部可以
3. 但是, 这只能防止无意间的调用, 不能防止恶意调用, 用Fluent Python的话来讲, 这是一种safety device, not security device, 用国语来讲, 就是防君子不防xx, 因为可以通过obj._className__field在外部访问obj的私有__field.
补充知识:python中私有属性和私有方法,修改私有属性的值
如果一个属性是以两个下划线开始 就标识这个这个属性是一个私有属性
self.__money = 1000000
如果一个方法是以两个下划线开始 也代表已经私有
子类继承了父类 如果父类的属性私有 将不会被子类继承
私有属性和私有方法可以在类的里面使用
自定义类中 如果一个属性进行了私有 在类的外面不能调用
修改私有属性的值
如果需要修改一个对象的属性值,通常有2种方法
对象名.属性名 = 数据 ----> 直接修改
对象名.方法名() ----> 间接修改
私有属性不能直接访问,所以无法通过第一种方式修改,一般的通过第二种方式修改私有属性的值:定义一个可以调用的公有方法,在这个公有方法内访问修改。
class Person(object):
def __init__(self):
self.name = "小明"
self.__age = 20
#获取私有属性的值
def get_age(self):
return self.__age
#设置私有属性的值
def set_age(self, new_age):
self.__age = new_age
#定义一个对象
p = Person()
#强行获取私有属性
#崇尚一切靠自觉
print(p._Person__age)
print(p.name)
#想在类的外面获取对象的属性
ret = p.get_age()
print(ret)
#想在类的外面修改对象私有属性的值
p.set_age(30)
print(p.get_age())
来源:https://blog.csdn.net/weixin_35653315/article/details/78073377
0
投稿
猜你喜欢
- 1. 首先,你需要安装最新的服务包为了提高服务器安全性,最有效的一个方法就是升级到SQL Server 2000 Service Pack
- <table> <tr> &nb
- 基于web的技术中,分页是一个老的不能再老的,但大家津津乐道的问题,随着xml技术的日渐应用,把xml应用到分页当中,也是一种可能,当然网上
- 前言无论是自己要在精心P过的自拍上添加个性文字,或者是摄影爱好者要在拍摄的作品里添加水印,亦或是在网页或者移动应用中实时生成文字和图片的组合
- 提到sa弱口令,我们首先就会想到,许多数据库都有1个类似的超级管理员账号,比如:Oracle是"system"和&quo
- 基本简介dot函数为numpy库下的一个函数,主要用于矩阵的乘法运算,其中包括:向量内积、多维矩阵乘法和矩阵与向量的乘法。1. 向量内积向量
- 本文实例为大家分享了python实现简单贪吃蛇的具体代码,供大家参考,具体内容如下1. 导入游戏库import pgzrunimport r
- MySQL扩展库操作MySQL数据库的步骤如下:1:获取连接.2:选取书库。3:设置操作编码。4:发送SQL指令(MySQL数据库可以分为四
- ClickHouse是近年来备受关注的开源列式数据库(DBMS),主要用于数据联机分析(OLAP)领域,于2016年开源。目前国内社区火热,
- 文档格式的排错 我妈妈_的清单中有数十条菜谱,甚至数百条。如果产生一个致命错误,排错将非常困难 - 你将一行一行地寻找丢失的标记符。如果使用
- 什么是网络?网络是由节点和连线构成,表示诸多对象及其相互联系。在数学上,网络是一种图,一般认为专指加权图。网络除了数学定义外,还有具体的物理
- 在这里我们将介绍的是MySQL内存使用上的线程独享,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,
- 某些情况下:我们希望在一个SQL Server下访问另一个sqlserver数据库上的数据,或者访问其他oracle数据库上的数据,要想完成
- 在 Google 搜索结果页面中,将其 Logo 图标右键另存为后可以发现,它并非单纯的
- 打包下载Pain.php <?php class Pain { public $var=array(); public $tpl=ar
- <?php /********************************************** *&n
- MySQL字符集出错的解决方法:错误案例: Illegal mix of collations (gbk_chinese_ci,I
- 本文实例讲述了JavaScript使用正则表达式获取全部分组内容的方法。分享给大家供大家参考,具体如下:1. 需要使用正则表达式的exec2
- Python 中提供了对时间日期的多种多样的处理方式,主要是在 time 和 datetime 这两个模块里。一、time 模块time 模
- 如果你的模型中含有 datetime 类型的字段,表单中需要用户输入日期和时间,那么你如何保证不同用户输入的时间都遵循一定的格式 (DD/M