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


猜你喜欢
- 前言写 Python 的经常要写一些命令行工具,虽然标准库提供有命令行解析工具 Argparse,但是写起来非常麻烦,我很少会使用它。命令行
- 于是写测试程序。。。不行 下载最新的ODBC。。。还是不行 通过sql plus查询。。。咦?竟然也查不到。。。 于是,折腾。。。折腾。。。
- PHP重启php-fpm的方法启动php-fpm:/usr/local/php/sbin/php-fpmphp 5.3.3 以后的php-f
- 1.准备工作先来到有道在线翻译的界面http://fanyi.youdao.com/F12 审查元素 ->选Network一栏,然后F
- 一、读取Excel文件使用pandas的read_excel()方法,可通过文件路径直接读取。注意到,在一个excel文件中有多个sheet
- Access method(访问方法):此步骤包括从文件中存储和检索记录。Alias(别名):某属性的另一个名字。在SQL中,可以用别名替换
- 在进行CSS网页布局开发时,您肯定遇到过形形色色的布局问题,虽然有大量的教程提供帮助,但最后可能被搞得焦头烂额。本文的目的是让您的设计过程更
- 使用sql的计划任务可以处理一些特殊环境的数据,除了使用windows系统的计划任务来定时处理,不过要配合程序才行,有些事情可以直接使用sq
- HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;XPath 使用路径表达式
- SQL Server内存会不断增加当 SQL Server 数据库引擎在 Microsoft? Windows NT? 或 Windows?
- 1.静态加载 CSS,图片资源文件在页面渲染过程中可以并行下载,不会阻塞。在IE8,FF下,也可以支持JS的并行下载。尽管页面的JS下载加速
- 浏览器的具体功能都储存在服务器端的Browscap.ini中:<% SET
- 哈夫曼树原理秉着能不写就不写的理念,关于哈夫曼树的原理及其构建,还是贴一篇博客吧。https://www.jb51.net/article/
- 本文实例讲述了Flask框架工厂函数用法。分享给大家供大家参考,具体如下:在我们开始学习FLask的时候,创建应用的实例是用app=Flas
- 阅读上一篇:垂直栅格与渐进式行距(上) 新问题来也匆匆,去也“冲冲”。距上次发布垂直栅格与渐进式行距(上)发布,已经不知不觉过去了
- 什么是模式前阵子准备期末考试,劳神又伤身的,实在闲不得空来更新文章,今天和大家说说javascript中的设计模式。首先呢,我们需要知道的是
- window.close(); 关闭浏览器窗口js代码的总结介绍序号关闭代码需要确认无任何作用无需确认测试1window.close()IE
- 井字棋作为我们在上学时代必玩的一款连珠游戏,你知道如何做到先手必然不会输吗?今天我们就用HTML、css、js来实现一款井字棋游戏。先看成品
- 用golang来实现的webserver通常是是这样的//main.gopackage mainimport ("fmt"
- matplotlibmatplotlib是最流行的python底层绘图库,接下来就由小编为大家介绍一些关于matplotlib的一些基本图形