访问私有类变量

时间:2015-07-07 19:47:23

标签: python class python-2.7 properties scope

在学习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#,对我来说似乎很奇怪。我的错误在哪里?

2 个答案:

答案 0 :(得分:7)

您应该知道以下内容:

  1. 当你写入一个不存在的对象属性时,python系统通常不会抱怨,只是创建一个新属性。
  2. 私有属性不受Python系统保护。这是设计决定。
  3. 隐藏私有属性。原因是,继承链中不应该发生冲突。屏蔽是通过一些隐式重命名完成的。私有属性将具有真实名称
  4.   "_<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'