python中 _、__、__xx__()区别及使用场景


Posted in Python onJune 30, 2020

理论

  • Python中不存在真正的私有方法。为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API。但是,这只是一个形式上的约定,python并不阻止调用。
  • __双下划线的作用是避免覆盖其内容,实现的机制是在带有双下划线的方法或属性前加上_类名的标识。由于,python自动对方法和属性进行了改写,所以直接调用带有双下划线的方法是调用不到的。
  • “xx”经常是操作符或本地函数调用的magic methods。在上面的例子中,提供了一种重写类的操作符的功能。它是用于Python调用的。

1、访问权限(private、public)与继承方式(只有public继承)

在面向对象编程语言中,类的属性与方法都会设置访问控制权限,从而满足我们的设计需求。一般而言,我们通常会将对象的属性设置为私有的(private)或受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是公开的(public),因为公开的方法就是对象向外界提供的接口。 在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用 两个下划线作 为开头, 下面的代码可以验证这一点。

class Test:
 def __init__(self, foo):
  self.__foo = foo  # 私有属性

 # 定义私有函数,外界不可以直接访问,但是可以通过【_类名__函数名】去调用私有函数
 def __bar(self):
  print(self.__foo)
  print('__bar')

def main():
 """
 test = Test('hello')
 # AttributeError: 'Test' object has no attribute '__bar'
 test.__bar()
 # AttributeError: 'Test' object has no attribute '__foo'
 print(test.__foo)
 """
 
 # 使用以下这种方式就可以在类的外部调用类的私有属性与方法
 test._Test__bar()
 print(test._Test__foo)

if __name__ == "__main__":
 main()

在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问。所以大多数Python程序员会 遵循一种命名惯例,就是让属性名以 单下划线 开头来表示属性是受保护的 ,本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻,让调用者知道这是不应该直接访问的属性或方法,而且这样做并不影响子类去继承这些东西。

2、__xx__() 的使用

  • 在python中,方法名如果是__xx__()的话,那么就有特殊的功能,因此叫做“魔法”方法;
  • 当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据;
  • __str__()方法需要返回一个字符串,当做这个对象的描写。

案例:定义一个类描述数字时钟

import time

class Clock(object):
 """数字时钟"""

 def __init__(self, hour=0, minute=0, second=0):
  """初始化方法

  :param hour: 时
  :param minute: 分
  :param second: 秒
  """
  self._hour = hour
  self._minute = minute
  self._second = second

 def run(self):
  """走字"""
  self._second += 1
  if self._second == 60:
   self._second = 0
   self._minute += 1
   if self._minute == 60:
    self._minute = 0
    self._hour += 1
    if self._hour == 24:
     self._hour = 0

 def __str__(self):
  """显示时间"""
  return '%02d:%02d:%02d' %(self._hour, self._minute, self._second)


def main():
 clock = Clock(23, 59, 58)
 while True:
  print(clock)
  time.sleep(1)
  clock.run()

if __name__ == '__main__':
 main()

注意:Python类中的那些魔法方法,如__str__、__repr__等,这些方法并不是私有成员哦,虽然它们以双下划线开头,但是他们也是以双下划线结尾的,这种命名并不是私有成员的命名,

到此这篇关于python中 _、__、__xx__()区别及使用场景的文章就介绍到这了,更多相关python  _、__、__xx__() 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的元类编程入门指引
Apr 15 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
Django中间件实现拦截器的方法
Jun 01 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
python3学生名片管理v2.0版
Nov 29 Python
使用Python 统计高频字数的方法
Jan 31 Python
python调用c++传递数组的实例
Feb 13 Python
浅析Python 引号、注释、字符串
Jul 25 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
Python selenium模块实现定位过程解析
Jul 09 Python
Django实现内容缓存实例方法
Jun 30 #Python
Pytorch 卷积中的 Input Shape用法
Jun 29 #Python
Python闭包装饰器使用方法汇总
Jun 29 #Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 #Python
Python接口测试环境搭建过程详解
Jun 29 #Python
python字典的值可以修改吗
Jun 29 #Python
python怎么自定义捕获错误
Jun 29 #Python
You might like
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
php的urlencode()URL编码函数浅析
2011/08/09 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
vue-cli3+typescript新建一个项目的思路分析
2019/08/06 Javascript
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python中使用HTMLParser解析html实例
2015/02/08 Python
Python contextlib模块使用示例
2015/02/18 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
学习十八届三中全会精神实施方案
2014/02/17 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
学校学期工作总结
2015/08/13 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书