我有以下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私有变量和函数,那么策略可以扩展到获取和设置之外,我明白这可能会导致一些笨拙的代码 - 让我们说我们并不担心优雅。这种编程有名称吗?
答案 0 :(得分:3)
确定的用户仍然可以通过
来绕过你的防御f.get.__closure__[0].cell_contents.value
f.get.__closure__[0].cell_contents.value = "some new value"
以这种方式编程的一般缺点是,你所做的只是为自己创造更多的工作,尽管所有这些工作,你仍然无法真正阻止任何人访问“私人”数据。