为什么在公共方法中无法调用私有方法?
我有以下这段代码:
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 爱好者想要纠正或进一步解释一下?