-1

我有以下 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 私有变量和函数进行建模,该策略可以扩展到获取和设置之外,而且我知道这可能会导致一些笨拙的代码——假设我们不担心优雅。这种类型的编程有名称吗?

4

1 回答 1

3

坚定的用户仍然可以通过以下方式绕过您的防御

f.get.__closure__[0].cell_contents.value
f.get.__closure__[0].cell_contents.value = "some new value"

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

于 2013-11-01T06:40:56.100 回答