当前位置: 首页 > news >正文

Python——私有化 和 属性property

Python——私有化 和 属性property

一、私有化

  • xx: 公有变量
  • _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
  • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
  • __xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__ , __ 不要自己发明这样的名字
  • xx_:单后置下划线,用于避免与Python关键词的冲突

通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或者属性)如:_Class__object)机制就可以访问private了。

总结

  • 父类中属性名为__名字的,子类不继承,子类不能访问
  • 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性
  • _名的变量、函数、类在使用from xxx import *时都不会被导入

 

二、属性property

1. 私有属性添加getter和setter方法

 1 class Money(object):
 2     def __init__(self):
 3         self.__money = 0
 4 
 5     def getMoney(self):
 6         return self.__money
 7 
 8     def setMoney(self, value):
 9         if isinstance(value, int):
10             self.__money = value
11         else:
12             print("error:不是整型数字")

2. 使用property升级getter和setter方法

 1 class Money(object):
 2     def __init__(self):
 3         self.__money = 0
 4 
 5     def getMoney(self):
 6         return self.__money
 7 
 8     def setMoney(self, value):
 9         if isinstance(value, int):
10             self.__money = value
11         else:
12             print("error:不是整型数字")
13     money = property(getMoney, setMoney)

运行结果:

In [1]: from get_set import Money

In [2]: 

In [2]: a = Money()

In [3]: 

In [3]: a.money
Out[3]: 0

In [4]: a.money = 100

In [5]: a.money
Out[5]: 100

In [6]: a.getMoney()
Out[6]: 100

3. 使用property取代getter和setter方法

@property成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用

  • 将方法转换为只读
  • 重新实现一个属性的设置和读取方法,可做边界判定
 1 class Money(object):
 2     def __init__(self):
 3         self.__money = 0
 4 
 5     @property
 6     def money(self):
 7         return self.__money
 8 
 9     @money.setter
10     def money(self, value):
11         if isinstance(value, int):
12             self.__money = value
13         else:
14             print("error:不是整型数字")

运行结果:

In [3]: a = Money()

In [4]: 

In [4]: 

In [4]: a.money
Out[4]: 0

In [5]: a.money = 100

In [6]: a.money
Out[6]: 100

 

转载于:https://www.cnblogs.com/yxh-amysear/p/9460657.html

相关文章:

  • python again_收藏!最全从Python小白到大牛,要走的路这里都有(初级篇)
  • .Net Core缓存组件(MemoryCache)源码解析
  • php 函数变量 前加,php在函数和变量前面加上@和$符号的区别详解
  • 凸函数与简森不等式(Jensen's inequality)
  • php date参数n,总结PHP date()参数列表
  • 小程序自定义函数—数字千位转换
  • tp3.2.3php环境要求,TP3.2.3开发手册
  • 控件模板
  • php 热点,PHP+jQuery实现中国地图热点数据统计展示效果
  • phpspy.php,一款php后门 phpspy的情况
  • Appium 之处理首次启动手机App时的系统权限弹框
  • 体对角线 matlab,Matlab计算结果显示求不出精确解
  • 数据库ACID操作---事务四原则
  • php html转pdf 简书,Laravel Html 导出 PDF 方案 ----- wkhtmltopdf laravel-snappy
  • aps.net的身份证背景图片
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【附node操作实例】redis简明入门系列—字符串类型
  • express + mock 让前后台并行开发
  • Javascript设计模式学习之Observer(观察者)模式
  • JS变量作用域
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • mysql外键的使用
  • Python利用正则抓取网页内容保存到本地
  • session共享问题解决方案
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue 重置组件到初始状态
  • vue数据传递--我有特殊的实现技巧
  • 构建二叉树进行数值数组的去重及优化
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 离散点最小(凸)包围边界查找
  • 面试遇到的一些题
  • 前端临床手札——文件上传
  • 如何编写一个可升级的智能合约
  • 数据科学 第 3 章 11 字符串处理
  • 网页视频流m3u8/ts视频下载
  • 线上 python http server profile 实践
  • 消息队列系列二(IOT中消息队列的应用)
  • 小程序开发之路(一)
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 一文看透浏览器架构
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $forceUpdate()函数
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (pytorch进阶之路)扩散概率模型
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (四)汇编语言——简单程序
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)linux 命令大全
  • (转)nsfocus-绿盟科技笔试题目