当我在公开方法中时,为什么我不能调用私有方法?
问题描述:
我有以下代码:当我在公开方法中时,为什么我不能调用私有方法?
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
我在做什么错?
答
您需要self
:已经习惯了,如果你从C#/ C++/Java的未来
self.__private()
类的蟒蛇拿,像它看起来像你。这可能是屠杀了pythonic的措辞方式,但你可以这样想(它帮助我):
每个类定义了一个名字空间,它自身定义为self
,并且不包含名字该类的一个实例。带有两个下划线的“私人”事物会发生错位,因此无需用特殊名称称呼它,但从内部您可以简单地使用。
乔在他的评论中正常私有变量提到的通常只是命名以单下划线,双下划线轧液这么继承可以没有子类名称冲突的工作。在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私人,要做到这一点:也
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()
,如果你还没有准备好,请阅读本节文档:HTTP:/ /docs.python.org/tutorial/classes.html#private-variables单下划线是“私有”变量的典型约定。当您希望避免在从您的“MyClass”继承的类中发生名称冲突时,通常只使用双下划线。双下划线将调用名字改编,这可能是你想要的这里什么,但我想确保你意识到这一点...... – 2011-02-04 17:57:43
请不要使用`__`。它被保留用于“名称修改”,这是Python在内部确保内部名称不会相互冲突的一个方面。 – 2011-02-04 18:11:54