如何访问"私人" 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)
答案 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的答案,了解为什么没有得到预期的输出。