在Python中,对象名称前的单前导下划线和双前导下划线代表什么?


当前回答

下面是一个简单的示例,说明双下划线财产如何影响继承的类。因此,使用以下设置:

class parent(object):
    __default = "parent"
    def __init__(self, name=None):
        self.default = name or self.__default

    @property
    def default(self):
        return self.__default

    @default.setter
    def default(self, value):
        self.__default = value


class child(parent):
    __default = "child"

如果然后在python REPL中创建子实例,您将看到以下内容

child_a = child()
child_a.default            # 'parent'
child_a._child__default    # 'child'
child_a._parent__default   # 'parent'

child_b = child("orphan")
## this will show 
child_b.default            # 'orphan'
child_a._child__default    # 'child'
child_a._parent__default   # 'orphan'

这对一些人来说可能很明显,但在一个复杂得多的环境中,这让我措手不及

其他回答

对于方法,可以使用双下划线隐藏私有“方法”,模式如下:

# Private methods of MyClass
def _MyClass__do_something(obj:'MyClass'):
    print('_MyClass__do_something() called. type(obj) = {}'.format(type(obj)))

class MyClass():
    def __init__(self):
        __do_something(self)

mc = MyClass()

输出:

_MyClass__do_something() called. type(obj) = <class '__main__.MyClass'>

我今天在尝试对类方法使用双下划线时遇到了这个问题,并得到了NameError:name“_<class><method>”未定义错误。

_foo:只是惯例。程序员指示变量是私有的(无论在Python中意味着什么)。__foo:这有真正的意义。解释器将此名称替换为_classname__foo,以确保该名称不会与其他类中的类似名称重叠。__foo__:只是惯例。Python系统使用不会与用户名冲突的名称的方法。

在Python世界中,没有其他形式的下划线有意义。此外,在这些约定中,类、变量、全局等之间没有区别。

.variable是半私有的,仅用于约定

.__variable通常被错误地认为是超级私有的,而它的实际含义只是为了命名mangle以防止意外访问[1]

.__variable__通常为内置方法或变量保留

您仍然可以访问__如果您非常想的话,可以对变量进行损坏。双下划线只是将变量命名为mangles或重命名为instance_类名__已损坏

例子:

class Test(object):
    def __init__(self):
        self.__a = 'a'
        self._b = 'b'

>>> t = Test()
>>> t._b
'b'

t.b是可访问的,因为它仅按惯例隐藏

>>> t.__a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Test' object has no attribute '__a'

找不到t.__a,因为它由于名称损坏而不再存在

>>> t._Test__a
'a'

通过访问实例_className__variable而不仅仅是双下划线名称,您可以访问隐藏值

Python中不存在只能从对象内部访问的“私有”实例变量。然而,大多数Python代码都遵循一个惯例:前缀为下划线的名称(例如_spam)应被视为API的非公共部分(无论是函数、方法还是数据成员)。应将其视为实施细节,如有更改,恕不另行通知。

参考https://docs.python.org/2/tutorial/classes.html#private-变量和类本地引用

根据Python中下划线的含义

单前导下划线(_var):表示名称仅供内部使用的命名约定。通常不由Python解释器强制执行(通配符导入除外),仅作为程序员的提示。单尾下划线(var_):按惯例使用,以避免与Python关键字的命名冲突。双前导下划线(__var):在类上下文中使用时触发名称更改。由Python解释器强制执行。双前导和尾随下划线(__var__):表示Python语言定义的特殊方法。避免为自己的属性使用此命名方案。单下划线(_):有时用作临时或不重要变量的名称(“不在乎”)。另外:Python REPL中最后一个表达式的结果。