_var
var_
__var
__var__
_
class Test: def __init__(self): self.foo = 11 self._bar = 23
>>> t = Test() >>> t.foo 11 >>> t._bar 23
class
或def
不能将其用做变量名称。在这种状况下,您能够附加一个下划线以消除命名冲突>>> def make_object(name, class): SyntaxError: "invalid syntax" >>> def make_object(name, class_): ... pass
让咱们使用内置dir()
函数查看该对象的属性:python
class Test: def __init__(self): self.foo = 11 self._bar = 23 self.__baz = 23
>>> dir(t) ['__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__', '_bar', 'foo']
__baz
这是Python解释程序应用的名称修饰。这样作是为了防止变量在子类中被覆盖。class ExtendedTest(Test): def __init__(self): super().__init__() self.foo = 'overridden' self._bar = 'overridden' self.__baz = 'overridden'
>>> t2 = ExtendedTest() >>> t2.foo 'overridden' >>> t2._bar 'overridden' >>> t2.__baz AttributeError: 'ExtendedTest' object has no attribute '__baz'
>>> dir(t2) ['_ExtendedTest__baz', '__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__', '_bar', 'foo']
>>> t2._ExtendedTest__baz 'overridden'
>>> t2._Test__baz 23
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'"
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
_MangledGlobal__mangled
。而后,我在名为的类的上下文中访问了变量MangledGlobal
。因为名称修改,我可以_MangledGlobal__mangled
像在类上的方法__mangled
内部同样引用全局变量test()
。__mangled
,_MangledGlobal__mangled
由于它以两个下划线字符开头。这代表名称修饰与类属性无关。它适用于任何以类上下文中使用的两个下划线字符开头的名称。__init__
了对象构造函数或__call__
使对象可调用之类的内容。这些dunder方法一般被称为魔术方法class PrefixPostfixTest: def __init__(self): self.__bam__ = 42
>>> PrefixPostfixTest().__bam__ 42
>>> for _ in range(3): print("Python") Python Python Python
car
元组拆成单独的变量,可是我只对color
and的值感兴趣mileage
。可是,为了使解包表达式成功,我须要将元组中包含的全部值分配给变量。那是“ _
”用做占位符变量的地方>>> car = ('red', 'auto', 12, 3812.4) >>> color, _, _, mileage = car >>> color 'red' >>> mileage 3812.4 >>> _ 12
_
”仍是大多数Python REPL中的特殊变量,它表明解释器评估的最后一个表达式的结果。若是您在解释器会话中工做,而且想访问之前的计算结果,这将很方便。或者,若是您正在动态构建对象,而且想与它们交互而不先给它们指定名称,则:>>> 20 + 3 23 >>> _ 23 >>> print(_) 23 >>> list() [] >>> _.append(1) >>> _.append(2) >>> _.append(3) >>> _ [1, 2, 3]
Pattern | Example | Meaning |
---|---|---|
Single Leading Underscore | _var |
Naming convention indicating a name is meant for internal use. Generally not enforced by the Python interpreter (except in wildcard imports) and meant as a hint to the programmer only. |
Single Trailing Underscore | var_ |
Used by convention to avoid naming conflicts with Python keywords. |
Double Leading Underscore | __var |
Triggers name mangling when used in a class context. Enforced by the Python interpreter. |
Double Leading and Trailing Underscore | __var__ |
Indicates special methods defined by the Python language. Avoid this naming scheme for your own attributes. |
Single Underscore | _ |
Sometimes used as a name for temporary or insignificant variables (“don’t care”). Also: The result of the last expression in a Python REPL. |
模式 | 例 | 含义 |
---|---|---|
Single Leading Underscore | _var |
表示名称的命名约定仅供内部使用。一般不禁Python解释器强制执行(通配符导入除外),而且仅做为对程序员的提示。 |
Single Trailing Underscore | var_ |
按照惯例使用,以免与Python关键字命名冲突。 |
Double Leading Underscore | __var |
在类上下文中使用时触发名称修改。由Python解释器强制执行。 |
Double Leading and Trailing Underscore | __var__ |
表示由Python语言定义的特殊方法。避免为您本身的属性使用此命名方案。 |
Single Underscore | _ |
有时用做临时变量或可有可无变量的名称(“可有可无”)。另外:Python REPL中最后一个表达式的结果。 |
原文:https://dbader.org/blog/meaning-of-underscores-in-python程序员