- 1. python
- 1.1. 下划线 `__` 开头的变量
- 1.1.1. 示例
- 1.1.2. 公有变量名
- 1.1.3. 半私有变量名
- 1.1.4. 私有变量名
- 1.1.5. 魔法方法
# 以数字、字母开头: 正常的公有变量名
a = 1
def aa():
pass
# 以单下划线开头: 半私有的变量名
_b = 2
def _bb():
pass
# 以双下划线开头: 私有变量名
__c = 3
def __cc():
pass
# 以双下划线开头, 双下划线结尾: 内置属性名或者魔法方法名
__name__, __dir__
1.1.2. 公有变量名
以此类名称命名的对象, 为公有对象, 任何人都可以使用。
1.1.3. 半私有变量名以此类名称命名的对象, 需要分为两种情况
- 类外
类外的半私有对象、私有对象, 功能一致, 均是在本模块中可以正常使用, 但是不能被直接导入并调用
如果一定要在模块外使用, 那么需要导入本模块, 然后使用 (模块名. 变量名) 进行调用
- 类中
类中的半私有对象, 仅仅是概念上的私有, 默认不要再类外进行调用
实际在类外, 均可以使用 (实例名. 变量名 / 类名. 变量名) 进行调用
1.1.4. 私有变量名以此类名称命名的对象, 也需要分为两种情况
- 类外
此种情况下的对象, 和半私有对象一样, 可参照上面
- 类中
类中的私有对象, 在类外均不能直接调用, 可以理解为真私有
但是, python 中没有完全私有的对象, 此种对象也是可以在类外进行调用的, 这里涉及到一个概念: 矫直
class A:
def get_1(self):
return 1
def _get_2(self):
return 2
def __get_3(self):
return 3
print(dir(A))
结果为:
['_A__get_3', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_get_2', 'get_1']
从打印结果中我们看到, 类 A 并不存在 __get_3 这么一个属性, 但是存在一个 _A__get_3 的属性, 这就是矫直
python 对于出现在类中的私有属性或者私有方法, 进行矫直, 矫直方法就是在私有属性名、私有方法名前添加( _类名 )
那么, 我们想要调用类的私有属性和方法的时候, 就可以直接用矫直后的属性名进行调用。
1.1.5. 魔法方法这是 python 自己实现的属性和方法, 一般不允许自定义类似此种命名方式的属性或者方法。



