访问 python 属性背后的"private"变量



如何访问Python属性后面的"private"变量?

在下面的代码中,我得到Hello World而不是我期望的World World。我猜该属性具有不同的范围,导致self属性与模块不同。如果是这样,有没有办法访问基础变量?或者是否有不同的成语用于"类外的代码应使用与类中的代码不同的 getter"?

class Foo():
    def __init__(self):
        self._x = 'Hello'
        self.x = 'World'
    @property
    def x(self):
        return self._x
    @x.setter
    def x(self, val):
        self._x = val
foo = Foo()
print(foo._x)
print(foo.x)

你忘了从 object 继承,所以你创建了一个旧式类。 property二传手不适用于旧式课程。如果你从 object 继承,你会从两个print得到World,就像你预期的那样:

>>> class Foo(object):
...     def __init__(self):
...         self._x = 'Hello'
...         self.x = 'World'
...     @property
...     def x(self):
...         return self._x
...     @x.setter
...     def x(self, val):
...         self._x = val
...
>>> foo = Foo()
>>> print foo._x
World
>>> print foo.x
World

正在通过foo._x访问私有变量_x

在这种情况下,典型的情况是根本不定义x属性,即删除行self.x = 'World'。这样,您就可以使用属性x来访问属性_x(并且由于私有并不是真正的私有,您当然也可以使用 _x 直接访问该属性)。

编辑:我答案的第一部分具有误导性,请参阅 user2357112 的答案,了解为什么您没有得到预期的输出。

最新更新