访问"私人" python属性后面的变量

时间:2016-05-22 02:33:09

标签: python properties scope

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

在以下代码中,我得到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)

2 个答案:

答案 0 :(得分:4)

您忘记继承object,因此您创建了一个旧式的类。 property setter不适用于旧式类。如果您继承自object,则会从World获得print,如您所愿:

>>> 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

答案 1 :(得分:2)

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

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

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