文档章节

Python中下划线的主要作用

 陈小超123
发布于 2015/02/21 21:18
字数 651
阅读 8
收藏 0

在Python中下划线只要有4个用处,分别是:

  1. 丢弃不必要的变量名

  2. 重命名另一个模块中的函数

  3. 使一个变量变成私有变量

  4. 保护父类中得方法不会被重写

一下是这4类用处的具体代码案列。

1.丢弃不必要的变量名

  如果我们需要简单地重复某个步骤,比如像下面这样

for i in range(5):
     # do something
     pass

  上面这段代码里面的变量i没有实际意义,我们就可以用"_"代替。

  再比如舍弃从数据库中查询出的不必要的字段

for field1, field2, _, field3 in cur.fetchall():
    # do something
    pass

当遇到一个变量你必须要定义,但是这个变量又没有实际用处的时候,都应该用"_"给此变量命名,表示这是一个被丢弃的变量,可以增加代码的可维护性。

2.重命名另一模块中得函数

假设module_a.py中有一个say_hello函数

def say_hello():
    print "hello"

在另外一个文件foo.py中我们可以这样写来调用say_hello函数

from module_a import say_hello as _
_()

这种严重破坏可读性,所有并不提倡。

这一点其实和上面一点本质上是一样的,都是把一个对象命名为_,所以如果这两种写法结合使用的话,_的含义就是以最后一个命名为准。

3.使一个变量变为私有变量

这里的_和Java里的private有一样的功能,如果一个变量或函数以__(两个_)开头,则表示这个变量或函数只能在此类或此模块中被访问。

class Foo():
    aaa = 5
    __bbb = 6

foo = Foo()
print foo.aaa
print foo.__bbb

5
Traceback (most recent call last):
  File "/Users/xxx/PycharmProjects/untitled/b.py", line 10, in <module>
    print foo.__bbb
AttributeError: Foo instance has no attribute '__bbb'
Process finished with exit code 1

4.保护父类中得方法不被重写

class A():
    def __say_hello(self):
        print "hello from A"

class B(A):
    def __say_hello(self):
        print "hello from B"

a = A()
b = B()
print dir(a), dir(b)
print b._A__say_hello(), b._B__say_hello()


/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/xxx/PycharmProjects/untitled/b.py
['_A__say_hello', '__doc__', '__module__'] ['_A__say_hello', '_B__say_hello', '__doc__', '__module__']
hello from A
None hello from B
None
Process finished with exit code 0

从上面的例子中可以看出子类B没有重写父类A中的__say_hello()方法是因为类中以__开头的方法会被Python自动替换为_[class_name][method_name]的形式,在外部不能用方法名直接调用这些方法,相当于类中的私有方法。


© 著作权归作者所有

共有 人打赏支持
下一篇: ER图
粉丝 0
博文 3
码字总数 1170
作品 0
浦东
程序员
私信 提问
python有趣用法汇总(持续更新)

使用python过程中经常会不经意间遇到非常有趣的用法,于是特意搜集了一些 有趣的用法 1.for-else用法 循环正常结束则执行else语句。一般用于循环找符合条件的元素,如果找到则调出循环,不会...

p柯西
06/05
0
0
Python中的类、对象、继承

类 Python中,类的命名使用帕斯卡命名方式,即首字母大写。 Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): 省略父类名表示该类直接继承自,类的实例化如下: class Pers...

雪飞鸿
2016/11/03
0
0
Python核心编程(第二版)学习笔记02 【第3章 Python基础】

Python核心编程(第二版)学习笔记02 【第3章 Python基础】 2009-4-16 20:45 Tony 1 python语句基本规则和特殊字符: 反斜杠 \ 继续上一行 分号 ; 将两个语句连接在一行中 冒号 : 将代码块的...

Free Man
2009/04/16
1K
0
如何利用Python实现权限设置?有些人只怕连这个操作都没想到过!

一、私有化的实现 在Python中想定义一个类是比较简单的,比如要定义一个Person类,如下代码即可: 当然我们也可以给类添加相应的属性,比如Person的姓名,年龄,性别等,并且在new一个Perso...

Python新世界
07/26
0
0
Python 代码风格 和 PEP8

Python 代码风格 和 PEP8 Python 的代码风格由 PEP 8 描述。这个文档描述了 Python 编程风格的方方面面。在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格。...

2shou2shou
2013/04/22
0
2

没有更多内容

加载失败,请刷新页面

加载更多

No transaction aspect-managed TransactionStatus in scope

No transaction aspect-managed TransactionStatus in scope 如果当前事务操作的实现所在方法没有开启事务,就会报出这样的异常。 例如你在A方法调用B方法,B方法开启了事务,A方法没有开启事...

嘴角轻扬30
15分钟前
1
0
SpringBoot整合Redis Lettuce

最近在准备集成的基础框架使用Spring Boot2搭建,其中Redis的支持不仅仅是丰富了它的API,更是替换掉底层Jedis的依赖,取而代之换成了Lettuce(生菜) jedis跟lettuce的区别 Lettuce 和 Jedis ...

lemonLove
21分钟前
1
0
mysqldumpslow 慢查询日志分析工具

首先得配置my.cnf: #====================================================================================================================##=====================================......

吴伟祥
22分钟前
2
0
如何基于阿里云搭建适合初创企业的轻量级架构?

----基于阿里云搭建的适合初创企业的轻量级架构 前言 在项目的初期往往存在很多变数,业务逻辑时刻在变,而且还要保证快速及时,所以,一个灵活多变、快速部署、持续集成并可以适应多种情况的...

阿里云云栖社区
22分钟前
2
0
SpringBoot基础教程4-1-1 使用JdbcTemplate操作数据库及事务管理

1 概述 SpringBoot封装的JdbcTemplate,使用模板模式,去除JDBC繁琐的重复代码,并提供了基于注解的事务管理;下面详细介绍如何使用JdbcTemplate操作数据和事务管理。 2 添加依赖 <dependenc...

Mkeeper
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部