这个地方的_b和b之间有什么区别

zjm*_*126 1 python

class a:
    def __init__(self):
        self._b()#why here use _b,not b,What's the difference
        self._c='cccc'#why here use _c,not c,What's the difference
    def _b():
        print 'bbbb'
Run Code Online (Sandbox Code Playgroud)

a.py

class a:
    def __init__(self):
        self._b()#why here use _b,not b,What's the difference
        self._c='cccc'#why here use _c,not c,What's the difference
    def _b(self):
        print 'bbbb'
Run Code Online (Sandbox Code Playgroud)

b.py

from  a import *
b=a()
b._b()
print b._c
Run Code Online (Sandbox Code Playgroud)

它打印bbbb bbbb bbbb bbbb cccc

为什么可以打印出这些,不是_b和_c私有变量.

Jar*_*die 10

使用下划线为变量或函数名称加前缀是Python中的一种约定,用于指示变量是私有的.来自文档:

在Python中不存在除对象内部之外无法访问的私有"实例变量".但是,大多数Python代码都遵循一个约定:前缀为下划线的名称(例如_spam)应被视为API的非公共部分(无论是函数,方法还是数据成员) .它应被视为实施细节,如有更改,恕不另行通知.


zzz*_*eek 8

根据pep8(http://www.python.org/dev/peps/pep-0008/),单个下划线旨在表示"通常为私有"的方法或属性.解释器本身没有与单个下划线的交互,它更像是一个约定.双下划线OTOH在翻译中具有重要意义.