2016-05-22 11 views
0

如何访问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) 

回答

2

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

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

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

+0

错过了就在我的面前。谢谢。 –

+0

@QtotheC看到我的编辑,我的原始答案是误导。 – 101

4

你忘了继承object,所以你创建了一个旧式的类。 property setter不适用于旧式类。如果从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 
+0

从'print'和'print()'推断,你使用的是python2,它看起来像OP使用python3;如果是这种情况,你的“旧式”课程的解释不成立。 –

+0

@ReblochonMasque:但在Python 3中,[他们两次都得到'World'](http://ideone.com/gDSsex)。我认为提问者更有可能在括号中使用'print',因为他们根本不了解Python版本差异和传统语法。 – user2357112