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定义的特殊名称遵循该约定即可 。
- 第2天 | 12天搞定Python,运行环境(详细步骤)
- Java基础知识回顾,还记得吗?
- Python高级技巧:用一行代码减少一半内存占用
- 手把手教你用python编程写一款自己的音乐下载器
- Python爬虫入门第一课:如何解析网页
- 刷爆全网的动态条形图,只需5行Python代码就能实现
- 让你的输出变得更帅,Python炫酷的颜色输出与进度条打印
- 斐波那契数列:python实现和可视化
- Python 3.9 正式发布!一图秒懂新特性
- 云主机必备的10个开源安全工具