Python中私有字段的策略

时间:2013-11-01 06:31:11

标签: python field private

我有以下Python代码,我认为它模仿了一个“私有”字段,因为我们创建的变量只能由getter访问并由setter修改,而不是直接发现。

class Foo:
  def __init__( self, value ):
    node = Node( value )
    self.get = lambda : node.get()
    self.set = lambda newValue : node.set( newValue )

class Node:
  def __init__( self, value ):
    self.value = value
  def set( self, value ):
    self.value = value
  def get( self ):
    return self.value

if __name__ == "__main__":
    f = Foo( 17 )
    print dir(f) #prints __doc__, __init__, __module__, get, set
    print f.get() #prints 17
    f.set(16)
    print f.get() #prints 16

与Java不同,由于其他线程中讨论的各种原因,私有字段不会内置到Python中,但我想知道使用这种限制变量的方法有哪些优点/缺点?有没有使用获取/设置方法来访问这些“私有”变量的方法?

显然,如果我们想要建模Java私有变量和函数,那么策略可以扩展到获取和设置之外,我明白这可能会导致一些笨拙的代码 - 让我们说我们并不担心优雅。这种编程有名称吗?

1 个答案:

答案 0 :(得分:3)

确定的用户仍然可以通过

来绕过你的防御
f.get.__closure__[0].cell_contents.value
f.get.__closure__[0].cell_contents.value = "some new value"

以这种方式编程的一般缺点是,你所做的只是为自己创造更多的工作,尽管所有这些工作,你仍然无法真正阻止任何人访问“私人”数据。