为什么在公共方法中无法调用私有方法?

6 投票
2 回答
5192 浏览
提问于 2025-04-16 11:14

我有以下这段代码:

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 个回答

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()
22

你需要用到 self

self.__private()

如果你是从 C#/C++/Java 过来的,Python 的类可能需要一些时间来适应。这可能不是很符合“Pythonic”的表达方式,但你可以这样理解(这对我有帮助):

每个类都有一个命名空间,这个命名空间由类内部的 self 定义,而外部则是通过这个类的实例名称来定义。带有两个下划线的“私有”属性会被处理成特殊名称,所以在外部调用时需要用特定的名字,但在内部你可以直接用 self.__private() 来调用。

正如 Joe 在评论中提到的,普通的私有变量通常只用一个下划线命名,双下划线的作用是为了在继承时避免子类中的名称冲突。Python 并没有强制隐私的规则,这只是一个约定,意味着你不能在类外使用私有变量。

正如 Thomas 提到的,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 是更好的选择)。

有没有 Python 爱好者想要纠正或进一步解释一下?

撰写回答