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实现动态加载模块、类、函数的方法分析
Jul 18 Python
Python列表推导式与生成器表达式用法示例
Feb 08 Python
Python安装Flask环境及简单应用示例
May 03 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
在Pandas中处理NaN值的方法
Jun 25 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
python使用glob检索文件的操作
May 20 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
Jun 05 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
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
Python数据类型详解(一)字符串
2016/05/08 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
资深生产主管自我评价
2013/09/22 职场文书
带病坚持工作事迹
2014/05/03 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
商务邀请函
2015/01/30 职场文书
离职信范文
2015/06/23 职场文书
Java移除无效括号的方法实现
2021/08/07 Java/Android
Java中try catch处理异常示例
2021/12/06 Java/Android