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-04-29 19:02:55 +08:00 · 3402 次点击
    这是一个创建于 3494 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如何才能将类中的属性进行彻底的封装,只允许实例按照规定的方法进行访问呢?
    相当于是创建了一个接口,只有通过接口才能访问或修改或添加属性,而其他方式都是被禁止的,让内部的属性私有化。
    想达到这样的目的,应该如何设定类呢?
    我按照这两天搜索的结果来看,目前最满足需求的设定是这样的:
    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-04-29 19:04:11 +08:00
    这么封装的意义是什么?有必要么?
    napretep
        2
    napretep  
    OP
       2015-04-29 19:20:20 +08:00
    @ipconfiger
    防止别人直接修改类里面的数据呀。。
    我担心运行以后,有人可以通过某些途径实现对类中数据的直接修改。
    ryd994
        3
    ryd994  
       2015-04-29 21:44:31 +08:00 via Android
    @napretep 就算你防住了,你能防住别人动内存么?
    phx13ye
        4
    phx13ye  
       2015-04-29 21:52:22 +08:00
    最讨厌javabean了
    timonwong
        5
    timonwong  
       2015-04-29 21:54:59 +08:00   ❤️ 1
    zope 像您招手: http://docs.zope.org/zope.interface

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

    已我的水平,只能这么做。
    程序已经跑起来了,如果程序没有乱import的话,我只能去攻内存,跟代码没关系。
    程序没跑起来,我写其中部分代码。情况就如楼上所说。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:21 · PVG 14:21 · LAX 22:21 · JFK 01:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.