既然__开头是私有属性, 为什么还可以直接打印 obj.__dir__(),或者obj.__dict__

为什么dir(), dict_私有方法和属性可以直接访问?

讨论数量: 3
pardon110

默认惯例 双下划线默认是一些类对象方法,单下划线私有方法。 python的私有只是个语法糖,告诉你不要直接访问修改。

3年前 评论
gufeng0176 (楼主) 3年前

另外好像只有两个下划线的可以有办法外部访问,odj._Class__方法(),
一个下划线的我没有找到访问方法? odj._Class_方法()也访问不了呀

3年前 评论
Jason990420

由于存在类专用成员的有效用例(即避免名称与子类定义的名称发生名称冲突),因此对这种称为名称修改的机制的支持有限。形式上的任何标识符 __spam至少两个前导下划线,至多一个尾随下划线)在文本上均被替换为_classname__spam,其中classname,当前类名已去除前导下划线。只要不存在标识符的语法位置,就可以进行这种改写,只要它出现在类的定义内即可。

__dir__, __dict__ 都有兩个尾随下划线, 不符合以上要求

>>> class MyClass():
    def __hello__(self):
        print('__hello')
    def __hello(self):
        print('__hello')
    def _hello(self):
        print('_hello')
>>> a = MyClass()
>>> a.__hello__()
__hello
>>> a._MyClass__hello()
__hello
>>> a._hello()
_hello
3年前 评论
benny_jane 3年前
Jason990420 (作者) 3年前
benny_jane 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!