为什么我在公共方法内部时不能调用私有方法?

2024-04-26 10:22:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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

我做错什么了?在


Tags: 代码nameselfifisdefmyclassprivate
2条回答

您需要self

self.__private()

Python中的类如果你来自C/C++/java,就习惯了。这可能是在屠杀“Python式”的措辞方式,但你可以这样想(它帮了我):

每个类都定义了一个命名空间,从它自己内部定义为self,从外部定义为该类的一个实例的名称。”Private”带有两个下划线的东西会被弄乱,因此从没有下划线的地方你必须用一个特殊的名称来调用它,但是从内部你可以简单地使用self.__private()。在

正如Joe在他的评论中提到的,普通的私有变量通常只是用一个下划线命名,而双下划线会破坏它,这样继承就可以在子类中不发生名称冲突的情况下工作。python中没有对隐私权的强制,它纯粹是约定不能在类之外使用私有变量。在

正如托马斯所说,self也是一种惯例。对于任何方法(声明为类的一部分的函数),调用该方法的实例是传入的第一个参数。你可以很容易地做到:

^{pr2}$

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

有没有Python爱好者想纠正/进一步解释?在

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

相关问题 更多 >