文档章节

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]的形式,在外部不能用方法名直接调用这些方法,相当于类中的私有方法。


© 著作权归作者所有

共有 人打赏支持
粉丝 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
0
0
如何利用Python实现权限设置?有些人只怕连这个操作都没想到过!

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

Python新世界
07/26
0
0
利用Python实现权限设置的详细教程

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

Python新世界
07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用户体验要素——以用户为设计中心

一、用户体验是什么 产品会与外界发生联系,人们如何去使用产品,人们使用产品无非解决两种问题,一,提高效率;二娱乐。而用户体验兼顾着功能和界面两个方面,为的是“提高人们的工作效率”...

铸剑为犁413
39分钟前
0
0
学习设计模式——代理模式

1. 认识代理模式 1. 定义:为其他对象提供一种代理以控制对这个对象的访问。 2. 组织结构: Proxy:代理对象,要实现与目标代理对象的相同的接口,这样就可以使用代理来代替具体的目标对象,...

江左煤郎
今天
1
0
java JDK动态代理

本篇随笔是对java动态代理中的JDK代理方式的具体实现。 首先需要定义一个接口,为其定义了两个方法:   public interface UserService { public void add(); public void delete(); } 然后需...

编程SHA
今天
2
0
轻松理解Dubbo分布式服务框架

Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的...

别打我会飞
今天
2
0
TypeScript基础入门之JSX(一)

转发 TypeScript基础入门之JSX(一) 介绍 JSX是一种可嵌入的类似XML的语法。 它旨在转换为有效的JavaScript,尽管该转换的语义是特定于实现的。 JSX在React框架中越来越受欢迎,但此后也看到了...

durban
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部