访问私有 class 变量
Accessing private class variable
在学习 Python 时,我遇到了这种奇怪的行为:
考虑这个简单的问题 class :
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
它在对象实例化后不改变名称,这很好,因为我希望实例变量是私有的。另一方面,我认为它会抱怨访问这个变量。它甚至不会抱怨访问一个神秘的 "age" 变量并稍后正确打印它。
我来自 C#,这对我来说似乎很奇怪。我的错误在哪里?
要使用 模拟Python 中的readonly/private 变量,请使用property
语法。 (Comments/other 答案指出,如果您知道如何访问变量,仍然可以访问该变量——感谢您的提醒)。这是一种方法:
>>> 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'
你应该知道以下内容:
- 当您写入不存在的对象属性时,python 系统通常不会报错,而只是创建一个新属性。
- 私有属性不受Python系统保护。这是设计决定。
- 私有属性将被屏蔽。原因是继承链中不应该有冲突。屏蔽是通过一些隐式重命名完成的。私有属性将具有 真实 名称
"_<className>__<attributeName>"
有了那个名字,就可以从外面访问了。当从 class 内部访问时,名称将自动正确更改。
在学习 Python 时,我遇到了这种奇怪的行为:
考虑这个简单的问题 class :
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
它在对象实例化后不改变名称,这很好,因为我希望实例变量是私有的。另一方面,我认为它会抱怨访问这个变量。它甚至不会抱怨访问一个神秘的 "age" 变量并稍后正确打印它。
我来自 C#,这对我来说似乎很奇怪。我的错误在哪里?
要使用 模拟Python 中的readonly/private 变量,请使用property
语法。 (Comments/other 答案指出,如果您知道如何访问变量,仍然可以访问该变量——感谢您的提醒)。这是一种方法:
>>> 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'
你应该知道以下内容:
- 当您写入不存在的对象属性时,python 系统通常不会报错,而只是创建一个新属性。
- 私有属性不受Python系统保护。这是设计决定。
- 私有属性将被屏蔽。原因是继承链中不应该有冲突。屏蔽是通过一些隐式重命名完成的。私有属性将具有 真实 名称
"_<className>__<attributeName>"
有了那个名字,就可以从外面访问了。当从 class 内部访问时,名称将自动正确更改。