当我在公共方法中时,为什么我不能调用私有方法?

Bob*_*lan 6 python private public

我有以下代码:

class MyClass:
    def __private(self):
        print "Hey man! This is private!"

    def public(self):
        __private()
        print "I don't care if you see this!"

if __name__ == '__main__':
    x = MyClass()
    x.public()
Run Code Online (Sandbox Code Playgroud)

但是它给了我以下错误:

NameError: global name '_MyClass__private' is not defined

我究竟做错了什么?

Cri*_*ole 22

你需要self:

self.__private()
Run Code Online (Sandbox Code Playgroud)

如果你来自C#/ C++/Java,python中的类习惯了,就像你看起来一样.这可能是屠杀"pythonic"方式的措辞,但你可以这样思考它(它帮助了我):

每个类定义一个从其自身内部定义的名称空间self,而不是该类的实例名称.带有两个下划线的"私有"东西会被破坏,所以从没有你必须通过一个特殊的名称来调用它,但是从你内部可以简单地使用它self.__private().

正如Joe在他的评论中提到的,正常的私有变量通常只用一个下划线命名,双下划线会破坏它,因此继承可以在子类中没有名称冲突的情况下工作.python中没有隐私强制执行,纯粹的惯例是说你不能在课堂外使用私有变量.

正如托马斯所说,self这也是一个惯例.对于任何方法(声明为类的一部分的函数),调用该方法的实例是传入的第一个参数.您可以轻松地执行此操作:

def __private(randomText):
    print "Hey man! This is private!"

def public(otherRandomText):
    otherRandomText.__private()
    print "I don't care if you see this!"
Run Code Online (Sandbox Code Playgroud)

然而,如果你这样做,逻辑精神和良好的编程风格将永远困扰着你和你的后代.(self更可取的).

任何pythonistas希望纠正/进一步解释?

  • 严格来说,"自我"这个名称是一种惯例,而不是硬编码.类的任何方法都会将实例自动作为第一个变量传递,我们使用self来引用它.不过,这是学术性的:我从来没有看到过将其称为自我以外的任何理由. (3认同)
  • 不要担心男人!我不能告诉你我做了多少次.每当你在语言之间切换时,它可能会继续发生. (2认同)
  • @Bob @Cpfohl Yup,每次都在PHP中抓住我,因为我花了这么多年做C++ ... (2认同)