首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python类中私有变量的实际实现

python类中私有变量的实际实现
EN

Stack Overflow用户
提问于 2013-01-05 05:04:25
回答 3查看 1.8K关注 0票数 2

可能重复: Python中对象名之前的单下划线和双下划线的含义。

当我阅读关于私有变量链接的python文档时,我遇到了一个问题。

因此,文档告诉我们,用下划线命名私有变量是惯例,但是python并不使字段私有。

代码语言:javascript
复制
>>> class a():
      def __init__(self):
         self.public = 11
         self._priv = 12
>>> b = a()
>>> print b._priv
>>> 12

我想知道在python中是否有一种使变量“真正”私有的方法。

EN

回答 3

Stack Overflow用户

发布于 2013-01-05 05:06:57

  • Guido van Rossum说:我们都是成年人。
  • 扩展版:我们都是成年人。如果你必须的话,随时可以朝自己的脚开枪。

如果你必须的话,你可以把它藏起来,但你真的不应该:

代码语言:javascript
复制
class NonAdult(object):
    def __init__(self):
        self.__private_number = '42'
    def __getattr__(self, name):
        if name.startswith('__private'):
            raise AttributeError

if __name__ == '__main__':
    na = NonAdult()
    print(na.__private_number) # raises AttributeError
    print(na.__dict__['_NonAdult__private_number']) # would still return 42
票数 7
EN

Stack Overflow用户

发布于 2013-01-05 05:06:05

不,Python对象中没有私有变量或方法。“我们都是成年人”这个短语通常被用来解释他们被认为是不必要的。

单个下划线有时用于“私有”成员,只作为惯例购买;它没有功能用途。

导致双下划线导致名称损坏,但只是为了避免子类中的命名冲突。它不提供任何“私人会员安全”,因为你仍然可以得到他们。

票数 4
EN

Stack Overflow用户

发布于 2013-01-05 05:08:16

您可以使用双前导下划线来调用Pythons mangling。于是__priv变成了_MyClass__priv。它仍然是可访问的,但防止子类意外重写。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14168791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档