阻止在Python中访问“private”属性

时间:2012-05-08 16:07:13

标签: python encapsulation private-members

一个类在多大程度上可以“保护”其中一个属性来自外部访问?

例如,具有传统_secret属性的类,可以轻松访问原始值:

class Paranoid(object):
    def __init__(self):
        self._secret = 0

    def set(self, val):
        self._secret = val * 10

    def get(self):
        return self._secret / 10

p = Paranoid()
p.set(123)
print p.get() # 123
print p._secret # 1230, should be inaccessible

如何更难以访问_secret

对此没有实际的应用,我只是好奇是否有新的方法使其更难以访问(在Python的上下文中 - 所以忽略了你可以,例如,将调试器附加到Python进程和检查记忆)

2 个答案:

答案 0 :(得分:6)

你可能正在寻找getters and setters。稍微不那么复杂的方法是使用__secret,它将调用名称修改将其转换为_Paranoid__secret

但是,是的,我应该注意到python社区并不像某些语言那样真正重视隐私。或者俗话说 we're all consenting adults here

答案 1 :(得分:4)

>>> def Paranoid():
...     _secret_dict = {'_secret': 0}
...     class ParanoidClass(object):
...             def set(self, val):
...                     _secret_dict['_secret'] = val * 10
...             def get(self):
...                     return _secret_dict['_secret'] / 10
...     return ParanoidClass()
... 
>>> p = Paranoid()
>>> p.set(123)
>>> p.get()
123

这让我想起了Steve Yegge blog post