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

时间:2011-02-04 17:49:17

标签: 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()

然而,它给了我以下错误:

NameError: global name '_MyClass__private' is not defined

我做错了什么?

2 个答案:

答案 0 :(得分:22)

您需要self

self.__private()

如果你来自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!"

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

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

答案 1 :(得分:3)

你的代码是试图调用静态函数MyCalls .__ private,你想这样做:

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

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

if __name__ == '__main__':
    x = MyClass()
    x.public()