【问题标题】:Why does a private attribute of python class allow me to assign a value? [duplicate]为什么python类的私有属性允许我赋值? [复制]
【发布时间】:2014-03-01 12:11:21
【问题描述】:

我有一个具有私有属性的类

class DoGood():
     __prv = "i m private"
     def __init__(self):
         self.default_string = self.__prv

     def say_it_aloud(self):
         print self.default_string

我正在尝试从 python-cli 访问私有属性

>>> from sample import DoGood
>>> obj = DoGood()
>>> obj.__prv
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: DoGood instance has no attribute '__pro'

由于它是私有的,我无法访问它但是当我尝试分配一个值时,我可以做到

>>> obj.__prv = "changed in subclass"
>>> obj.say_it_aloud()
i m private

但是类对象内部的值并没有改变。但是为什么我能够分配它是否有任何目的

【问题讨论】:

  • obj.__pro 是一个错字。
  • 您创建了一个新属性,就像您创建了obj.someOtherAttribute = "blah"
  • 这并不是真正的复制品,尽管它是相关的。这个问题要具体得多。
  • 感谢 BrenBarn ppl 阅读问题并回答,请不要浏览并回答

标签: python


【解决方案1】:

您正在为您为该类创建的实例分配一个新属性。它不会改变 __prv 属性的值。

print DoGood._DoGood__prv # access a private attribute.

仍会输出“我是私人的”

【讨论】:

  • 不是因为它是私有的,而是因为它是一个类属性。
  • 是的@perreal。即使它是一个实例变量,私有属性也会被映射为 _ClassName__attrname,所以如果我们重新分配该属性,它不会改变实际属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2013-05-08
  • 1970-01-01
相关资源
最近更新 更多