Kwong 2019-12-01
夜暗归云绕柁牙,江涵星影鹭眠沙。
行人怅望苏台柳,曾与吴王扫落花。
我平时很常见到的带有下划线的python变量有两种:
__name__
变量for _ in theList
今天遇到了一些新的挑战:
本着“留下记录以加强记忆”的美好愿景,我检索并选择这个网站的解释进行翻译(曾经我莫名其妙地不喜欢这种翻译工作,现在倒是受用得很。唉)
Python中有五种下划线变量
在import
的时候,以前置单下划线开头的对象不会被引入(内部函数)
# This is my_module.py: def external_func(): return 23 def _internal_func(): return 42
>>> from my_module import * >>> external_func() 23 >>> _internal_func() NameError: "name '_internal_func' is not defined"
但是作为常规引入(regular imports)的变量还是可以可以读的:
>>> import my_module >>> my_module.external_func() 23 >>> my_module._internal_func() 42
一般来说,后置单下划线被用来避免和python内置关键词冲突
>>> def make_object(name, class): SyntaxError: "invalid syntax" >>> def make_object(name, class_): ... pass
前置双下划线被称为命名撕裂?(name mangling)。python解释器在面对这种变量时会对变量重新命名,从而形成一种只有内部方法可以访问的效果(内部参数):
class Test: def __init__(self): self.foo = 11 self._bar = 23 self.__baz = 23
>>> t = Test() >>> dir(t) ['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bar', 'foo']
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'"
这种变量被python解释器预留,命名和访问都是正常的。
临时变量
接下来需要进行的工作:
PEP8规范编程