下划线开头函数或变量
Python语言并没有访问控制,通过遵循一定的属性和方法命名规约来达到封装的目的,但是仍然能访问内部函数。
- 任何以单下划线
_
开头的名字都应该是内部实现
class A:
def __init__(self):
self._internal = 0 # An internal attribute
self.public = 1 # A public attribute
def public_method(self):
'''
A public method
'''
pass
def _internal_method(self):
pass
__
双下划线开头函数
class B:
def __init__(self):
self.__private = 0
def __private_method(self):
pass
def public_method(self):
pass
self.__private_method()
双下划线开始会导致访问名称变成其他形式。 比如,在前面的类B中,私有属性会被分别重命名为_B__private
和 _B__private_method
。 这时候你可能会问这样重命名的目的是什么,答案就是继承——这种属性通过继承是无法被覆盖的。比如:
class C(B):
def __init__(self):
super().__init__()
self.__private = 1 # Does not override B.__private
# Does not override B.__private_method()
def __private_method(self):
pass
这里,私有名称__private
和 __private_method
被重命名为 _C__private
和_C__private_method
,这个跟父类B中的名称是完全不同的。
- 有时候定义的一个变量和某个保留关键字冲突,这时候可以使用单下划线作为后缀
lambda_ = 2.0
直接运行程序时
__name__
=__main__
;import module时__name__
值为模块名字
重定义对象的字符串显示__str__()
和__repr__()
要改变一个实例的字符串表示,可重新定义它的__str__()
和 <