【发布时间】:2015-09-25 11:54:35
【问题描述】:
在学习 Python 时,我遇到了这种奇怪的行为:
考虑这个简单的类:
class Human(object):
def __init__(self, name):
self.__name = name
def description(self):
print("Hello, my name is %s" % self.__name)
我想避免在创建对象后更改名称。
如果我使用这个:
MyHuman = Human("Andy")
MyHuman.__name = "Arthur"
MyHuman.age = 23
MyHuman.description()
print MyHuman.age
它不会在对象实例化后更改名称,这很好,因为我希望实例变量是私有的。另一方面,我认为它会抱怨访问这个变量。它甚至不会抱怨访问一个神秘的“年龄”变量并在以后正确打印它。
我来自 C#,这对我来说似乎很奇怪。我的错在哪里?
【问题讨论】:
-
您的错误在于认为 Python 中有私有变量。最接近隐私的模拟是“不要注意幕后的变量”。如果有人真的想看看幕后,那取决于他们。官方用语是“同意的成年人”。
-
这里有一些关于 Python 对象和作用域的documentation。
-
好的,但是“年龄”变量呢?您可以即时创建变量(例如,如果我只是打错字)有点令人困惑,不是吗?
-
拼写错误会导致计算机程序出现意外行为,这会让人感到困惑吗?
-
你不能在 C#/Java/etc 中动态创建变量吗?与
int age = 23;? Python 允许您将这些变量放入任何对象的命名空间中,因为它非常方便。
标签: python class python-2.7 properties scope