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
soratadori
V2EX  ›  Python

python 读取实例的属性,一定要添加访问限制吗?

  •  
  •   soratadori · 2016-05-16 03:15:04 +08:00 · 2937 次点击
    这是一个创建于 2908 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例子

    class A:
        def __init__(self, var1):
            self.var1 = var1
            self.__var2 = var1
        def get(self):
            return self.var2
        def get2(self, var):
            return getattr(self, var)
    
    instance = A("123")
    a = instance.var1
    b = instance.get() 
    c = instance.get2("var2") 
    

    从灵活性角度来讲, a=c>b ,

    从速度来讲 b 的耗时约是 a 的 1.5 倍, c 的耗时约是 a 的 2.5 倍,

    从代码健壮性角度来看,也许是反过来的。

    Q1 假如我把这个操作封装在某个函数里,那么,在那个函数里还有必要做这种访问限制吗?

    Q2 在使用者能获取到源代码的情况下,有必要做这样的限制吗?

    Q3 一般什么样的实际情况下才会添加这种访问限制?

    3 条回复    2016-05-16 11:44:47 +08:00
    Sunyanzi
        1
    Sunyanzi  
       2016-05-16 04:08:18 +08:00   ❤️ 1
    Q1 如果你问的是「封装在一个类里」那么答案是没必要 ... 随便一个成员方法都可以绕过的限制毫无意义 ...

    Q2 答案是有必要 ... 获取到源代码并不代表可以获取变量的值 ... 想要变量不被不当获取只能做访问限制 ...

    Q3 访问限制的意义在于设置一个变量只能在某些既定的场景里被读或修改 ...

    比如变量只在当前类中使用那么就该设置为 Private ... 如果需要外部对这个变量只读就封装一个函数返回变量值 ...

    如果需要外部可以读写这个变量那么就设置为 Public ... 如果仅限当前类和他的孩子们读写就设置为 Protected ...

    顺带一提 ... 你的 get 和 get2 方法如果是我我会封装成一个 getter ... 参见 @property 装饰器 ...
    jixiangqd
        2
    jixiangqd  
       2016-05-16 08:43:15 +08:00
    讨论性能比较扯淡,要性能请选择 C ,所以性能根本不是不使用封装的理由。
    所以,根据实际情况选择合适的封装才是正确的做法,可读性,可维护性>>>>>>>>>所谓的性能。
    PyHub
        3
    PyHub  
       2016-05-16 11:44:47 +08:00 via iPhone
    好好的 Python 用成了 Java
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2217 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:17 · PVG 17:17 · LAX 02:17 · JFK 05:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.