访问私有 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'

你应该知道以下内容:

  1. 当您写入不存在的对象属性时,python 系统通常不会报错,而只是创建一个新属性。
  2. 私有属性不受Python系统保护。这是设计决定。
  3. 私有属性将被屏蔽。原因是继承链中不应该有冲突。屏蔽是通过一些隐式重命名完成的。私有属性将具有 真实 名称
  "_<className>__<attributeName>"

有了那个名字,就可以从外面访问了。当从 class 内部访问时,名称将自动正确更改。