Python|Python基础知识必备:最强字符——下划线,你的编程小帮手( 三 )


'__getattribute__' '__gt__' '__hash__' '__init__' '__le__'
'__lt__' '__module__' '__ne__' '__new__' '__reduce__'
'__reduce_ex__' '__repr__' '__setattr__' '__sizeof__' '__str__'
'__subclasshook__' '__weakref__' '_bar' 'foo' 'get_vars'


正如你可以看到__baz变成_ExtendedTest__baz以防止意外修改:
>>> t2._ExtendedTest__baz
'overridden'

但原来的_Test__baz还在:
>>> t2._Test__baz
42

双下划线名称修饰对程序员是完全透明的 。下面的例子证实了这一点:
class ManglingTest:
def __init__(self):
self.__mangled = 'hello'

def get_mangled(self):
return self.__mangled

>>> ManglingTest().get_mangled()
'hello'
>>> ManglingTest().__mangled
AttributeError: \"'ManglingTest' object has no attribute '__mangled'\"

名称修饰是否也适用于方法名称? 是的 , 也适用 。 名称修饰会影响在一个类的上下文中 , 以两个下划线字符(\"dunders\")开头的所有名称:
class MangledMethod:
def __method(self):
return 42

def call_it(self):
return self.__method()

>>> MangledMethod().__method()
AttributeError: \"'MangledMethod' object has no attribute '__method'\"
>>> MangledMethod().call_it()
42

这是另一个也许令人惊讶地运用名称修饰的例子:
_MangledGlobal__mangled = 23

class MangledGlobal:
def test(self):
return __mangled

>>> MangledGlobal().test()
23

六. 在名称之前和之后加上双下划线(例如__init__)这些是 Python 使用的特殊方法名称 。 对于我们来说 , 这只是一个约定 , 即 Python 系统使用与用户定义的名称不冲突的名称的一种方式 。 然后 , 我们通常会覆盖这些方法并为 Python 调用它们时定义所需的行为 。 例如 , 在编写类时__init__重写方法 。
没有什么可以阻止我们编写自己的特殊方法名称(但是最好别这么做):
>>> class C(object):
...def __mine__(self):
...pass
...
>>> dir(C)
... [... '__mine__' ...


尽量不要使用这种命名方式 , 只需要让Python定义的特殊名称遵循该约定即可 。