https://www.cnblogs.com/phpper/p/10618775.html

我们先看个详细的例子(注意双下划线name和age定义为私有变量):

class Person(object):def __init__(self, name, age):self.__name = nameself.__age = age    def get_age_fun(self):return self.__agedef set_age_fun(self, value): if not isinstance(value, int): raise ValueError('年龄必须是数字!')  if value < 0 or value > 100: raise ValueError('年龄必须是0-100')    self.__age = value def print_info(self):     print('%s: %s' % (self.__name, self.__age))p = Person('balala',20)
p.__age = 17print(p.__age) # 17
print(p.get_age_fun())  # 20
'''表面上看,上面代码“成功”地设置了__age变量 17,但实际上这个__age变量和class内部的__age变量不是一个变量!
内部的__age变量已经被Python解释器自动改成了_Person_age,而外部代码给p新增了一个__age变量。 所以调用 get_age_fun输出的是初始值
'''
p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35

表面上看,外部代码“成功”地设置了__age变量 17,但实际上这个_age变量和class内部的_age变量不是一个变量!
内部的_age变量已经被Python解释器自动改成了_Person_age,而外部代码给p新增了一个_age变量。 所以调用 get_age_fun输出的是初始值 20
而set_age_fun 通过class内部改变了age变量值,所以最终输出 balala: 35

(注意只改变了一个变量名: 原来的私有属性 __age 单下划线为: _age,也可以定义为:age.
解释:以一个下划线开头的实例变量名,比如_age,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当看到这样的变量时,意思是,“虽然可以被访问,但是,请视为私有变量,不要随意访问。”)

class Person(object):def __init__(self, name, age):self.__name = nameself._age = agedef get_age_fun(self):return self._agedef set_age_fun(self, value):if not isinstance(value, int):raise ValueError('年龄必须是数字!')if value < 0 or value > 100:raise ValueError('年龄必须是0-100')self._age = valuedef print_info(self):print('%s: %s' % (self.__name, self._age))p = Person('balala',20)
p._age = 17
print(p._age) # 17
print(p.get_age_fun()) # 这里是17 不再是 20,因为此时_age是全局变量,外部直接影响到类内部的更新值p.set_age_fun(35)
print(p.get_age_fun()) # 35print(p.print_info()) # balala: 35

看的出私有和全局的设置.

但是,上面的调用方法是不是略显复杂,没有直接用属性这么直接简单。

有没有可以用类似属性这样简单的方式来访问类的变量呢?必须的,对于类的方法
我们先来看一个稍微改造的例子:(使用Python内置的@property装饰器就是负责把一个方法变成属性调用.)

我们进入正题:看看@property的妙用之处:

class Person(object):def __init__(self, name, age):self.__name = nameself.__age = age@propertydef get_age_fun(self):return self.__age@get_age_fun.setter # get_age_fun是上面声明的方法def set_age_fun(self, value):if not isinstance(value, int):raise ValueError('年龄必须是数字!')if value < 0 or value > 100:raise ValueError('年龄必须是0-100')self.__age = valuedef print_info(self):print('%s: %s' % (self.__name, self.__age))p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun) # 20 注意这里不带()#p.set_age_fun(35) 注意不能这样调用赋值了
p.set_age_fun = 35 #  这里set_age_fun 就是 声明的函数不带()
print(p.get_age_fun) # 35
print(p.print_info()) # balala: 35

python类中的单下划线与双下划线相关推荐

  1. python 里面的单下划线与双下划线的区别

    python 里面的单下划线与双下划线的区别 Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __ ...

  2. 【Python特性】Python中的下划线和双下划线是什么意思?

    平时写代码经常碰到下划线.双下划线等"奇怪"的写法,今天特意花时间彻底解决这个问题.文章内容主要参考<深入理解Python特性>一书. 文章目录 前置单下划线:_var ...

  3. Python中的下划线、双下划线

    单下划线和双下划线在Python变量名和方法名中都有各自的含义.有些仅仅是作为约定,用于提示开发人员:而另一些则对Python解释器有特殊含义. 总的来说有一下几种情况: 前置单下划线:_var 后置 ...

  4. python前后双下划线_【Python】单下划线与双下划线的区别

    Python 用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式: l 单下划线( _ ) l 名称前的单下划线(如: _name ) l 名称前的双下划线(如: __name ) l ...

  5. 浅谈python 里面的单下划线与双下划线的区别

    更新时间:2017年12月01日 10:30:13   作者:空气中的臭氧 这篇文章主要介绍了浅谈python 里面的单下划线与双下划线的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起 ...

  6. python双划线_python 单下划线与双下划线的区别

    原标题:python 单下划线与双下划线的区别 python中下环线共有5中 下面开始一一介绍 1.单前导下划线 _xxx: 变量前面使用单下划线,用于指定该名称为"私有".为方便 ...

  7. Python笔记 · 私有方法、私有属性 单下划线、双下划线

    首先,不同于其他编程语言,Python中不存在真正意义上的"私有方法/属性",Python中所胃的"私有方法"要么基于约定,要么基于编译期的改写(Name Ma ...

  8. python中单下划线_foo与双下划线_Python中单下划线和双下划线

    什么是 Python? Python 之父 Guido van Rossum 说:Python是一种高级程序语言,其核心设计哲学是代码可读性和语法,能够让程序员用很少的代码来表达自己的想法. 对于我来 ...

  9. Python类中的私有属性和私有方法

    Python类中的私有属性和私有方法 Python是面向对象的语言,在Python里一切皆对象,所以大部分情况下,我们都是通过类的方式来编程. 但是Python中的属性和方法在类的外部默认是可以访问的 ...

最新文章

  1. oracle 时间减去一个月_一文看懂教孩子时间问题的进阶过程
  2. python代码大全p-[译]让你的Python代码优雅又地道
  3. tensorflow详解-tf.nn.conv2d(),tf.nn.max_pool()
  4. 第六篇T语言实例开发,多点找色应用
  5. IBM HTTP Server Websphere Plugin
  6. [scikit-learn 机器学习] 6. 逻辑回归
  7. 下滑加载更多js_vue.js怎么实现滑动到底部加载更多数据效果?
  8. B站发布51部国创作品新内容 公布《三体》动画新PV
  9. shiro服务器取不到用户信息,SpringMvc+Shiro有时候shiro取不到用户名
  10. C++:标准程序库-STL迭代器Iterator
  11. php无缝滚动文字,使用JS如何实现文字无缝滚动
  12. PPT实现倒计时功能(VBA实现)
  13. vue+express+mongodb+websocket 仿QQ即时聊天项目
  14. excel 查找重复值方法
  15. 一起学习荷花定律/金蝉定律和竹子定律
  16. EXCEL打印表格时如何添加带有公司名称的水印
  17. linux下usb转串口驱动分析
  18. 设计模式——开闭原则
  19. 发生交通事故当时没报警过后可否报警呢
  20. WEB 应用中的整体结构和层次关系

热门文章

  1. [已解决]网页源代码中韩文被utf-8编码后,变成带百分号%的字符串,最终转回韩文显示
  2. 调用部署在 MindSphere 中的 app 暴露的 APIs
  3. 转:笔记本电脑开机密码忘记的解决方法
  4. qt 绘制 流程图 案例 收集
  5. Ajax获取gzip,如何在javascript中解压缩gzip xhr响应
  6. 免拆诊断 | 2010 款宝马 320i 车冷机急加速时发动机熄火
  7. 彼得·德鲁克,现代管理之父,“大师中的大师”
  8. 阿里云盘资源搜索的网址
  9. 《1024伐木累》-小白篇之开发网站,三天!(中篇-3)-总章节十二
  10. 张口就来!国泰新点java开发笔试题