如何才能将类中的属性进行彻底的封装,只允许实例按照规定的方法进行访问呢?

2015-04-29 19:02:55 +08:00
 napretep
如何才能将类中的属性进行彻底的封装,只允许实例按照规定的方法进行访问呢?
相当于是创建了一个接口,只有通过接口才能访问或修改或添加属性,而其他方式都是被禁止的,让内部的属性私有化。
想达到这样的目的,应该如何设定类呢?
我按照这两天搜索的结果来看,目前最满足需求的设定是这样的:
1类中的属性变量名双下划线开头
2__slots__方法规定不许添加新属性
3__setattr__方法规定不允许修改属性值

但是,我后来也了解到,双下划线开头的变量名仍旧可以直接访问,只要在双下划线前面加上下划线类名,比如b._A__a,就可以绕过__a的隐藏而直接修改,这样看来就不是彻底安全的封装了。
slots方法很好,没有问题。
而__setattr__的问题更多,先是他只能防止赋值运算,对于列表的append防不住,然后是他的防止不仅对实例从外部直接修改属性有效,而且对实例内部方法修改属性也有效,这样就没法实现接口了。
总之实现的不是很理想。
所以想请问有什么比较好的办法可以解决这个问题吗?
3426 次点击
所在节点    Python
8 条回复
ipconfiger
2015-04-29 19:04:11 +08:00
这么封装的意义是什么?有必要么?
napretep
2015-04-29 19:20:20 +08:00
@ipconfiger
防止别人直接修改类里面的数据呀。。
我担心运行以后,有人可以通过某些途径实现对类中数据的直接修改。
ryd994
2015-04-29 21:44:31 +08:00
@napretep 就算你防住了,你能防住别人动内存么?
phx13ye
2015-04-29 21:52:22 +08:00
最讨厌javabean了
timonwong
2015-04-29 21:54:59 +08:00
zope 像您招手: http://docs.zope.org/zope.interface

不过,在大多数情况下,意义不大。
强约束最好是换一种语言。
sirgod
2015-04-29 22:00:50 +08:00
用另一个类再包一层呢?
asj
2015-04-29 22:16:13 +08:00
封装的意义在于清晰语义,避免无意的错误访问,而不是阻止不安全的访问。试想别人都接触你的源码了,真正恶意的话多的是办法,语言上的可见性限制又有什么用呢。
这种隐藏不是那种把银行账号密码藏起来的隐藏,而是像做某项工作前先把桌上无关东西收拾到抽屉里眼不见心不烦式的隐藏。
fburst
2015-04-30 00:54:51 +08:00
通过某些途径实现对类中数据的直接修改。

已我的水平,只能这么做。
程序已经跑起来了,如果程序没有乱import的话,我只能去攻内存,跟代码没关系。
程序没跑起来,我写其中部分代码。情况就如楼上所说。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/187311

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX