访问私有类变量

And*_*y M 3 python scope properties class python-2.7

在学习Python时,我遇到了这种奇怪的行为:

考虑这个简单的类:

class Human(object):
  def __init__(self, name):
    self.__name = name

  def description(self):
    print("Hello, my name is %s" % self.__name)
Run Code Online (Sandbox Code Playgroud)

我希望避免在创建对象后更改名称.

如果我用这个:

MyHuman = Human("Andy")
MyHuman.__name = "Arthur"
MyHuman.age = 23

MyHuman.description()
print MyHuman.age
Run Code Online (Sandbox Code Playgroud)

它不会在对象实例化后更改名称,这很好,因为我希望实例变量是私有的.另一方面,我认为它会抱怨访问这个变量.它甚至没有抱怨访问一个神秘的"年龄"变量并在以后正确打印它.

我来自C#,对我来说似乎很奇怪.我的错误在哪里?

Jue*_*gen 8

你应该知道以下内容:

  1. 当你写入一个不存在的对象的属性时,python系统通常不会抱怨,只是创建一个新属性.
  2. 私有属性不受Python系统的保护.这是设计决定.
  3. 私有属性将被屏蔽.原因是,继承链中不应该发生冲突.屏蔽是通过一些隐式重命名完成的.私有属性将具有真实姓名
  "_<className>__<attributeName>"
Run Code Online (Sandbox Code Playgroud)

使用该名称,可以从外部访问.从类内部访问时,名称将自动正确更改.