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

2016-05-16 03:15:04 +08:00
 soratadori

例子

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 一般什么样的实际情况下才会添加这种访问限制?

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

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

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

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

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

顺带一提 ... 你的 get 和 get2 方法如果是我我会封装成一个 getter ... 参见 @property 装饰器 ...
jixiangqd
2016-05-16 08:43:15 +08:00
讨论性能比较扯淡,要性能请选择 C ,所以性能根本不是不使用封装的理由。
所以,根据实际情况选择合适的封装才是正确的做法,可读性,可维护性>>>>>>>>>所谓的性能。
PyHub
2016-05-16 11:44:47 +08:00
好好的 Python 用成了 Java

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

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

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

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

© 2021 V2EX