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