[关闭]
@spiritnotes 2016-07-23T16:05:34.000000Z 字数 933 阅读 1833

Python中的下划线

Python DONE


Python的命名规则中大量使用下划线,使用厂家不同具有不同的含义

单下划线

解释器中

_作为交互解释器中执行语句的返回结果。

  1. >>> i = 1
  2. >>> _
  3. 4
  4. >>> 3*4
  5. 12
  6. >>> _
  7. 12

命名

  1. >>> begin, _, _, end = (1, 2, 3, 4)
  2. >>> for _ in l:
  3. do()
  1. from django.utils.translation import ugettext as _
  2. def ...():
  3. ouput = _('welcome')

以下划线开头

指定该函数或者方法是私有的

双下划线

双下划线做前缀

对解释器有特殊意义,Python会改写这些名称,避免与子类冲突。其在文本上会被替换成为_classname__spam等格式。在派生子类中要访问该变量值,则需要进行部分trick

  1. class A:
  2. def __f(self):
  3. print('A.f')
  4. class B(A):
  5. def __f(self):
  6. print('B.f')
  7. # print(super().__f()) # 改行会出错,里面的__f()会被替换为_B__f
  8. print(self._A__f())
  9. def f(self):
  10. self.__f()
  11. b = B()
  12. # b.__f() 外层不能调用该函数
  13. b.f()
  14. b._B__f()
  15. b._A__f()
  16. dir(b)

结果如下:

  1. B.f
  2. A.f
  3. #
  4. B.f
  5. A.f
  6. #
  7. A.f
  8. #
  9. ['_A__f',
  10. '_B__f',
  11. ...]

前后双下划线

这些是python的特殊方法名,是一种惯例,避免python系统中的名称不会于用户自定义的名称发生冲突,系统中大量域定义操作都是通过该方式的函数实现的。可以对该方法进行改写。

  1. class A:
  2. def __f__(self):
  3. print('A.f')
  4. class B(A):
  5. def __f__(self):
  6. print('B.f')
  7. print(super().__f__()) # 该处正常执行
  8. b = B()
  9. b.__f__()
  10. dir(b)

结果如下

  1. B.f
  2. A.f
  3. [...
  4. '__f__',
  5. ...]
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注