python中的下划线

Posted 千翻娃儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的下划线相关的知识,希望对你有一定的参考价值。

概述

python中的下划线主要分为如下几类:

  • 前置单下划线,如\\_a,\\_variable,主要是用于将变量或方法定义为私有属性。这里的私有属性并非如java中的私有,而是一种约定俗成,想强行访问仍旧可以正常访问。
  • 后置单下划线,如a\\_,val\\_,主要用于将变量区别,如变量名称和关键字冲突,后面加个下划线区别开来。
  • 前置双下划线,如\\_\\_val,类中带前置双下划线的变量或方法,都会触发python解释器的名称修饰,是不能直接通过该名称去访问到的,实现了一定程度上的隔离。
  • 前后都有双下划线,如\\_\\_init\\_\\_,这类方法是python中的魔法方法,可以去重载。
  • 单下划线本身如 \\_,主要用于无意义的变量名。

前置单下划线

将变量名,方法名指定为私有属性,但在外部仍旧可以访问到。这里只是一种约定俗成,对于私有方法或变量名,代表该对象/模块的这类方法或者变量不想暴露出来,应尽量避免访问私有属性或方法。

举例:

class A(object):
    def __init__(self):
        self._private=0
    def _private_method(self):
        print(\'AAAAA\')       
>>>a=A()
>>>a._private
0
>>>a._private_method()#均能直接访问
AAAAA

后置下划线

主要用于区分变量名

def_=3
int_=5

前置双下划线

用双下划线修饰属性或者方法,会出发名称修饰,即在外部访问时,该方法名或变量名会变为 \\_类名\\_\\_变量名;直接访问__变量名是不存在的。

举例:

class A(object):
    def __init__(self):
        self.__private=0
    def __private_method(self):
        print(\'AAAAA\')
>>>a=A()
>>>a.__private
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: \'A\' object has no attribute \'__private\'
>>>a.__private_method()#
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: \'A\' object has no attribute \'__private_method\'
    
>>>a._A__private
0
>>>a._A__private_method()
AAAAA

可以看到,这种情况下最好定义一个接口去直接访问。因为内部名称还是没变的,名称修饰主要是在实例化后调用属性或者方法时作用了。

class A(object):
    def __init__(self):
        self.__private=0
    def __private_method(self):
        print(\'AAAAA\')
    def get_p(self):
        return self.__private
>>>a=A()
>>>a.get_p()
0

包括上面的单下划线规约的私有属性,也可以通过定义接口方法去访问,这样的好处是私有的方法或者属性无法被篡改,可以很好的保护起来。这里可以和@property结合起来使用。

单下划线本身_

举例:

>>>a=[_ for _ in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>>a,_,_,d=func(*args,**kwargs)
#这种情况是我们只想要返回的第一个和第四个参数,中间两个对于当前模块没啥意义,就无需去定义一个变量名称。

以上是关于python中的下划线的主要内容,如果未能解决你的问题,请参考以下文章

python之路之前没搞明白4面向对象(封装)

Python 中的 Pythonic 用法或下划线(私有)名称

python中的双下划线__是啥意思? [复制]

Python/Matplotlib 中的文本下划线

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

python语法