我有以下代码:
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
我做错了什么?
答案 0 :(得分:22)
您需要self
:
self.__private()
如果你来自C#/ C ++ / Java,python中的类需要习惯,就像你看起来一样。这可能是屠杀“pythonic”方式的措辞,但你可以这样思考(它帮助了我):
每个类定义一个名称空间,该名称空间从其自身定义为self
,并且不定义该类的实例名称。带有两个下划线的“私有”东西会被破坏,所以从没有你必须用特殊名称来调用它,但是你可以从内部使用self.__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
更可取)。
任何pythonist都希望纠正/进一步解释?
答案 1 :(得分: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()