简述Python中"_"的使用常识

0. 背景

Python里面的下划线“_”使用频率明显比其他主流语言要多的多,而且在Python中,它也有自己独到的用处。本文主要简述:下划线在python中的使用常识。

1. 单下划线-将名称封装到类中

如果想将类中的“私有”数据封装到类的实例上,但是又需要考虑到Python缺乏对属性的访问控制问题。与其依赖语言特性来封装数据,Python程序员们更期望通过特定的命名规则来表达出对数据和方法的用途。

第一个规则是任何以单下划线(_)开头的名字应该总是被认为只属于内部实现。

比如:

class A:
    def __init__(self):
        self._internal = 0  # 前缀加入"_",是类中的一个“内部(internal)”属性
        self.public = 1     # 类中一个“公开(public)”属性

    def public_method(slef):
        ‘‘‘
        一个public方法
        ‘‘‘
        pass

    def _internal_method(self):
        ‘‘‘
        一个内部(internal)方法
        ‘‘‘
        pass

Python本身并不会阻止其他人访问内部名称。但是如果有人这么做了,则被认为是粗鲁的,而且可能导致产生出脆弱不堪的代码。应该要提到的是,以下划线为前缀的标识也可用于模块名称和模块级的函数。比如,如果见到有模块名以下划线前缀(例如,_socket),那么它就属于内部实现。同样的,模块级函数比如sys._getframe()使用起来也要格外小心。

2. 双下划线-名称重整(name mangling)

我们应该在类定义中也见到过以双下滑线(__)为前缀的名称。例如:

class B:
    def __init__(self):
        self.__private = 0  # 名称重整后为:_B__private

    def __private_method(self):
        ‘‘‘
        名称重整后为:_B__private_method
        ‘‘‘
        pass

    def public_method(self):
        self.__private_method()

以双下划线为前缀的名称会导致出现名称重整(name mangling)的行为。这样的属性不能通过继承而覆盖。

具体来说就是上面这个类中的私有属性会被分别重命名为_B__private_B__private_method。其实类似这样的名称重整的目的就是为了继承——这样的属性不能通过继承而覆盖。

class C(B):

    def __init(self):
        super().__init()
        self.__private = 1 # 此语句不会覆盖B.__private

    ‘‘‘ 此方法不会覆盖 B.__private_method(),
    因为名称重整后会成名称重整后为:_B__private_method,
    而此函数重整后为: _C__private_method
    ‘‘‘
    def __private_method(self):
        pass

这里,私有名称__private__private_method会被重命名为_C__ptvate_C_private_method,这和基类B中的重整名称不同。

“私有”属性存在两种不同的命名规则(单下划线和双下划线),这一事实引出了一个显而易见的问题:应该使用那种风格?

对于大部分代码而言,我们应该让非公有名称以单下划线开头。但是,如果我们知道代码中会涉及子类化处理,而且有些内部属性应该对子类进行隐藏,那么此时就应该使用双下划线开头。

3. 后缀单下划线-避免关键字冲突

此外还应该指出的是,有时候可能想定义一个变量,但是名称可能会和保留字产生冲突。基于此,应该在名称最后加上一个单下划线以示区别。比如:

lambda_ = 2.0 # 添加后缀下划线_ ,以避免与关键字"lambda"冲突

这里不采用以下划线前缀的原因是避免在使用意图上发生混淆,如果采用下划线开头的形式,那么可能会被解释为私有变量,而不是被认为是避免关键冲突。

时间: 2024-10-04 00:27:16

简述Python中"_"的使用常识的相关文章

python中_、__和__xx__的区别

python中_.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家. 英文原文地址:Difference between _, __ and __xx__ in Python 在学习Python时,很多人都弄不清楚各种下划线的意思,而且在这之前已经给其他人解释过很多遍了,是时候把它记录下来. "_"单下划线 Python中不存在真正的私有方法.为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不

Python中_,__,__xx__的区别

_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. __xx 双下划线开头 双下划线开头,是为了不让子类重写该属性方法.通过类的实例化时自动转换,在类中的双下划线开头的属性方法前加上”_类名”实现. __xx__ 此种写法为python内建属性方法,最好不要在外部调用 参考自:http://blog.csdn.net/wukai_std/article/detai

简述Python中的类与对象

Python中的类 类的定义 示例: class Person: country = "China" def __init__(self, name, age): self.name = name self.age = age def speak(self, word): print(word) 其中 country 是类属性,即 Person类 的静态属性,speak() 为 Person类的函数属性,即类的动态属性~ 类的实例化 对上述示例的类进行实例化: >>>

python 中_ 与__ 与__xxxx__的区别

_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. Python中不存在真正的私有方法.为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API. #!/usr/bin/env python   # coding:utf-8   class Test():   def __init__(self)

python中_, __, __foo__区别及使用场景

单下划线 1.带有单下划线的特性不会被 from module import *导入. 2.单下划线是Python程序员使用类时的约定,表明程序员不希望类的用户直接访问属性.仅仅是一种约定!实际上,实例._变量,可以被访问. 双下划线 1.防止被子类覆盖. 前后双下划线 供python内部使用,如__init__ new str 等. 原文地址:https://www.cnblogs.com/sixloop/p/python_abc.html

python中for _ in range () 中'_'的意思

python中for _ in range () 中’_'的意思 以斐波那契数列为例 #求前20项的斐波那契数 a = 0 b = 1 for _ in range(20): (a, b) = (b, a + b) print(a, end=' ') 其中’_’ 是一个循环标志,也可以用i,j 等其他字母代替,下面的循环中不会用到,起到的是循环此数的作用就像C语言中 for (int i ; i<100 ; i++){ 代码块; } 其中的’i’在下面并不会用到,起到的只是控制循环此数的作用——

Python 中的进程、线程、协程、同步、异步、回调(一)

一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说明一点术语.当我们说"上下文"的时候,指的是程序在执行中的一个状态.通常我们会用调用栈来表示这个状态--栈记载了每个调用层级执行到哪里,还有执行时的环境情况等所有有关的信息. 当我们说"上下文切换"的时候,表达的是一种从一个上下文切换到另一个上下文执行的技术.而"调度"指的是决定哪个上下文可以获得接下去的CPU时间的方法. 进程 进程是一种古老而典型的上下文系

详解 Python 中的下划线命名规则

在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单下划线(_)会在以下3种场景中使用: 1.1 在解释器中: 在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用. >>> _ Traceback (most recent call last): Fil

python中filter, map, reduce, lambda

python 中内置的几个函数filter, map, reduce, lambda简单的例子. #!/usr/bin/env python #_*_coding:utf-8_*_ #filter(function, sequence): #对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回. #可以看作是过滤函数. tasks = [ { 'id': 1, 'title