python 命名空间、权限

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Test:
def __init__(self):
self._a = 1
self.__b = 2 # 内部会被重命名为_Test__b
self.__c__ = 3

def print(self):
print(self._a)
print(self.__b)
print(self.__c__)
print('\n')

t = Test()
t.print()

t._a = 5
t._Test__b = 6
t.__c__ = 7
t.print()

ss

public private

需求

  • 私有变量
  • 私有方法
  • 私有类

实现 - python

Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量。

在python中定义私有变量只需要在变量名或函数名前加上 ”__“两个下划线,那么这个函数或变量就是私有的了。
在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername,也就是说,类的内部定义中,

  • 私有变量: 实例._类名__变量名
  • 私有方法: 实例._类名__方法名()
  • 私有类:

ssdfsd

  • xx: 公有变量
  • _xx: 表示保护成员(属性或者方法),只有类对象和子类对象自己能访问到这些变量。
    • 以单下划线开头的变量和函数被默认当作内部函数
    • 使用from module improt *时不会被获取,但是使用import module可以获取
    • 什么鬼设计
  • xx_:
    • 在解析时并没有特别的含义,但通常用于和 Python 关键词区分开来,比如如果我们需要一个变量叫做 class,但 class 是 Python 的关键词,就可以以单下划线结尾写作 class_
  • __xxx: 表示私有成员
    • 表示名字改编 (Name Mangling),即如果有一 Test 类里有一成员 __x,那么 dir(Test) 时会看到 _Test__x 而非 __x。这是为了避免该成员的名称与子类中的名称冲突。但要注意这要求该名称末尾没有下划线。
  • __xxx__: 表示这是一个特殊成员
    • 是一些 Python 的“魔术”对象,如类成员的 __init____del____add____getitem____call__ 等,以及全局的 __file____name__ 等。 Python 官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用。
  • _: 作被丢弃的名称

实现 - Java

实现 - C/C++

扩展阅读