Python3中_(下划线)和__(双下划线)的用途和区别

在看一些Python开源代码时,经常会看到以下划线或者双下划线开头的方法或者属性,到底它们有什么作用,又有什么样的区别呢?今天我们来总结一下(注:下文中的代码在Python3下测试通过)

_ 的含义

在python的类中没有真正的私有属性或方法,没有真正的私有化。

但为了编程的需要,我们常常需要区分私有方法和共有方法以方便管理和调用。那么在Python中如何做呢?

一般Python约定加了下划线 _ 的属性和方法为私有方法或属性,以提示该属性和方法不应在外部调用,也不会被from ModuleA import * 导入。如果真的调用了也不会出错,但不符合规范。

下面的代码演示加了_ 的方法,以及在类外面对其的可访问性。

class TestA:
  def _method(self):
    print('I am a private function.')
  def method(self):
    return self._method()
ca = TestA()
ca.method()

输出:

I am a private function.

在类TestA中定义了一个_method方法,按照约定是不能在类外面直接调用它的,为了可以在外面使用_method方法,又定义了method方法,method方法调用_method方法。

但是我们应该记住的是加了_的方法也可以在类外面调用:

ca._method()

输出:

I am a private function.

__ 的含义

Python中的__和一项称为name mangling的技术有关,name mangling (又叫name decoration命名修饰).在很多现代编程语言中,这一技术用来解决需要唯一名称而引起的问题,比如命名冲突/重载等.

Python中双下划线开头,是为了不让子类重写该属性方法.通过类的实例化时自动转换,在类中的双下划线开头的属性方法前加上”_类名”实现.

class TestA:
  def __method(self):
    print('This is a method from class TestA')
  def method(self):
    return self.__method()
class TestB(TestA):
  def __method(self):
    print('This is a method from calss TestB')
ca = TestA()
cb = TestB()
ca.method()
cb.method()

输出结果:

This is a method from class TestA
This is a method from class TestB

在类TestA中,__method方法其实由于name mangling技术的原因,自动转换成了_TestA__method,所以在A中method方法返回的是_TestA__method,TestB作为TestA的子类,只重写了__method方法,并没有重写method方法,所以调用B中的method方法时,调用的还是_TestA__method方法。

注意:在A中没有__method方法,有的只是_A__method方法,也可以在外面直接调用,所以python中没有真正的私有化

不能直接调用__method()方法, 需要调用转换之后的方法

ca.__method()

输出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'TestA' object has no attribute '__method'

转换后的方法名为:_TestA__method

ca._TestA__method()

输出:

This is a method from class TestA

在TestB中重写method方法:

class TestB(TestA):
  def __method(self):
    print('This is a method from calss TestB')
  def method(self):
    return self.__method()
cb = B()
cb.method()

输出:

This is a method from calss TestB

现在TestB中的method方法会调用_TestB__method方法:

1、_xxx 不能用于'from module import *' 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。

2、__xxx 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以

3、__xxx___ 定义的是特列方法。像__init__之类的

总结

python中没有真正的私有化,但是有一些和命名有关的约定,来让编程人员处理一些需要私有化的情况。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python中单下划线_的常见用法总结

    这篇文章给大家介绍python中单下划线_,具体内容如下所示: 前言 我们在阅读源码的时候经常会看到各种单下划线_的使用,所以今天特地做一个总结,而且其实很多(不是所有)关于下划线的使用都是一些约定俗成的惯例,而不是真正对python解释器有影响. 0x1存储上一条语句的执行结果 在python的解释器中,_是上一条语句的执行结果,最早是CPython施行,到现在其他类型的解释器也在使用 0x02作为一个无关紧要的变量 例如下面这个例子: for _ in range(10): print 'h

  • Python中的下划线详解

    这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 一. 单个下划线直接做变量名(_) 主要有三种情况: 1. 解释器中 _符号是指交互解释器中最后一次执行语句的返回结果.这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了. 复制代码 代码如下: >>> _ Traceback (most recent call last):   File "", line 1, in Nam

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

    在学习Python的时候,很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像 __this__ 这种.在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数的大小写一样,或是一些其他语言中的 private . public 的作用一样,但仔细深究,这不全是Python这样设计的初衷.下面我们具体分析. 主要存在四种命名 1. object # 公用方法 2. __object__ # 内建方法,用户不要这样定义 3.

  • 不知道这5种下划线的含义,你就不算真的会Python!

    什么是 Python? Python 之父 Guido van Rossum 说:Python是一种高级程序语言,其核心设计哲学是代码可读性和语法,能够让程序员用很少的代码来表达自己的想法. 对于我来说,学习 Python 的首要原因是,Python 是一种可以优雅编程的语言.它能够简单自然地写出代码和实现我的想法. 另一个原因是我们可以将 Python 用在很多地方:人工智能.数据科学.Web 开发和机器学习等都可以使用 Python 来开发. 国庆期间后台有小伙伴留言问我:"Python变量

  • Python中单、双下划线的区别总结

    前言 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读,易于在程序员之间交流. 我们大家在学习Python的时候,好像很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像__this__这种.在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数的大小写一样,或是一些其他语

  • Python中下划线的使用方法

    本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已. 单下划线(_) 通常情况下,会在以下3种场景中使用: 1.在解释器中:在这种情况下,"_"代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用. >>> _ Traceback (most recent call last): File "&l

  • Python3中_(下划线)和__(双下划线)的用途和区别

    在看一些Python开源代码时,经常会看到以下划线或者双下划线开头的方法或者属性,到底它们有什么作用,又有什么样的区别呢?今天我们来总结一下(注:下文中的代码在Python3下测试通过) _ 的含义 在python的类中没有真正的私有属性或方法,没有真正的私有化. 但为了编程的需要,我们常常需要区分私有方法和共有方法以方便管理和调用.那么在Python中如何做呢? 一般Python约定加了下划线 _ 的属性和方法为私有方法或属性,以提示该属性和方法不应在外部调用,也不会被from ModuleA

  • python中单下划线(_)和双下划线(__)的特殊用法

    函数使用单下划线_开头 使用单下划线(_)开头的函数_func不能被模块外部以: from module import *形式导入. 但可以用:from module import _func形式单独导入. 类属性和类方法使用单下划线_开头 _开头为保护类型的属性和方法,仅允许类内部和子类访问,类实例无法访问此属性和方法. 类属性和类方法使用双下划线__开头 __开头为私有类型属性和方法,仅允许类内部访问,类实例和派生类均不能访问此属性和方法. 所以双划线比单划线权限更严格. 补充说明 对于__

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

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

  • 一文带你了解Python中的双下方法

    目录 前言 1. init方法 2. 运算符的双下方法 2.1 比较运算符 2.2 算术运算符 2.3 反向算术运算符 2.4 增量赋值运算符 2.4 位运算符 3.字符串表示 4.数值转换 5.集合相关的双下方法 6.迭代相关的双下方法 7.类相关的双下方法 7.1 实例的创建和销毁 7.2 属性管理 7.3 属性描述符 8.总结 前言 大家在写 Python 代码的时候有没有这样的疑问. 为什么数学中的+号,在字符串运算中却变成拼接功能,如'ab' + 'cd'结果为abcd:而*号变成了重

  • Python中使用双下划线防止类属性被覆盖问题

    在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: def __init__(self): pass def calc_age(self): print('我是父类的方法') class PeopleInfo(Info): def __init__(self): super().__init__() def calc_age(self): print(123456) 如果你使用 PeopleInfo 初始化一个对象,

  • Python中的单下划线和双下划线使用场景详解

    单下划线 单下划线用作变量 最常见的一种使用场景是作为变量占位符,使用场景明显可以减少代码中多余变量的使用.为了方便理解,_可以看作被丢弃的变量名称,这样做可以让阅读你代码的人知道,这是个不会被使用的变量,e.g.. for _, _, filenames in os.walk(targetDir): print(filenames) for _ in range(100): print('PythonPoint') 在交互解释器比如iPython中,_变量指向交互解释器中最后一次执行语句的返回

  • python中的单下划线与双下划线以及绝对导入与相对导入

    目录 单下划线与双下划线 绝对导入与相对导入 硬编码的概念 单下划线与双下划线 在 python 中,会看到 _xx, xx 以及 __xx 这样的变量或者函数名,在这里做一个简要的总结. _xx:保护(protected)变量或函数,意思是只有类对象和子类对象能够访问到这些变量,不能用 ‘from module import *’ 导入.当变量或函数是私有的时候,用 _xx 来表示是很好的习惯.: __xx:私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据: _xx_:代表

  • python 函数、变量中单下划线和双下划线的区别详解

    目录 一._func 单下划线开头 --口头私有变量 1.1.在模块中使用单下划线开头 1.2.在类中使用单下划线开头 二.__func 双下划线开头的函数 --私有变量 2.1.在模块中使用双下划线开头 2.2.在类中使用双下划线开头 三.前后都有双下划线 --特殊变量 一._func 单下划线开头 --口头私有变量 1.1.在模块中使用单下划线开头 在Python中,通过单下划线_来实现模块级别的私有化,变量除外.一般约定以单下划线开头的函数为模块私有的,也就是说from moduleNam

随机推荐