在学习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#,对我来说似乎很奇怪。我的错误在哪里?
答案 0 :(得分:7)
您应该知道以下内容:
"_<className>__<attributeName>"
使用该名称,可以从外部访问。从班级内部访问时,名称将自动正确更改。
答案 1 :(得分:2)
要使用在Python中模拟readonly / private变量,请使用property
语法。 (评论/其他答案指出,如果您知道如何,仍然可以访问该变量 - 感谢您的提醒)。这是一种方法:
>>> class Test:
def __init__(self):
self.__a = 1
@property
def a(self):
return self.__a
>>> t = Test()
>>> t.a
1
>>> t.a = 2
AttributeError: cannot set attribute
>>> t.__a
AttributeError: 'Test' object has no attribute '__a'