如何才能将类中的属性进行彻底的封装,只允许实例按照规定的方法进行访问呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
napretep
V2EX    Python

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

  •  
  •   napretep 2015 年 4 月 29 日 3940 次点击
    这是一个创建于 3932 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如何才能将类中的属性进行彻底的封装,只允许实例按照规定的方法进行访问呢?
    相当于是创建了一个接口,只有通过接口才能访问或修改或添加属性,而其他方式都是被禁止的,让内部的属性私有化。
    想达到这样的目的,应该如何设定类呢?
    我按照这两天搜索的结果来看,目前最满足需求的设定是这样的:
    1类中的属性变量名双下划线开头
    2__slots__方法规定不许添加新属性
    3__setattr__方法规定不允许修改属性值

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

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

    已我的水平,只能这么做。
    程序已经跑起来了,如果程序没有乱import的话,我只能去攻内存,跟代码没关系。
    程序没跑起来,我写其中部分代码。情况就如楼上所说。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     957 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 20:27 PVG 04:27 LAX 12:27 JFK 15:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86