Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';当我';我在一个公共方法里面?_Python_Private_Public - Fatal编程技术网

Python 为什么可以';当我';我在一个公共方法里面?

Python 为什么可以';当我';我在一个公共方法里面?,python,private,public,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() 但是,它给了我以下

我有以下代码:

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()
但是,它给了我以下错误:

name错误:未定义全局名称“\u MyClass\u private”


我做错了什么?

你需要
self

self.__private()
如果你来自C#/C++/Java,python中的类需要适应,就像你看起来一样。这可能是在破坏“pythonic”的措辞方式,但你可以这样想(它帮助了我):

每个类定义一个名称空间,从内部定义为
self
,从外部定义为该类实例的名称。带有两个下划线的“Private”东西会被弄乱,因此从外部你必须用一个特殊的名称来称呼它,但从内部你可以简单地使用
self.\uu 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
更可取)


任何pythonistas想要更正/进一步解释吗?

您的代码正在尝试调用静态函数MyCalls。\u 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()

别担心,伙计!我不能告诉你我做过多少次了。每当你在语言之间切换时,它可能会一直发生。@鲍勃@ CPFHL YUP,每次在PHP中也能吸引我,仅仅是因为我花了这么多年时间做C++…精彩的解释。你认为我来自C风格的语言(C#)是对的。@Bob:我作弊,看了你的标签…;-)严格地说,名称
self
是一种约定,而不是硬编码的。类的任何方法都会自动将实例作为第一个变量传递,我们使用self来引用它。不过,这是学术性的:除了self之外,我从来没有看到过将其命名为任何东西的理由。此外,如果您还没有看到,请阅读文档的这一部分:单下划线是“私有”变量的典型约定。如果要避免继承自
MyClass
的类中的名称冲突,通常只使用双下划线。双下划线将调用名称混乱,这可能是您在这里想要的,但我想确保您知道它…请不要使用
\uuuu
。它是为“名称混乱”保留的,Python在内部做这件事是为了确保内部名称不会冲突。