首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中的私有变量和方法

Python中的私有变量和方法
EN

Stack Overflow用户
提问于 2010-08-02 13:46:54
回答 4查看 124.8K关注 0票数 67

可能重复:

The meaning of a single- and a double-underscore before an object name in Python

对于Python中的私有成员和方法,我应该使用_foo (下划线)还是__bar (双下划线)?

EN

回答 4

Stack Overflow用户

发布于 2010-08-02 13:51:51

请注意,Python中没有“私有方法”这样的东西。双下划线只是名称上的乱码:

代码语言:javascript
复制
>>> class A(object):
...     def __foo(self):
...         pass
... 
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()

因此,当您需要发生损坏时,__前缀是很有用的,例如,为了不与继承链上或下的名称冲突。对于其他用途,单下划线会更好,IMHO。

编辑,关于__上的混淆,PEP-8很清楚:

如果您的类打算子类化,并且您有不希望子类使用的属性,请考虑使用双前导下划线命名它们,而不使用尾部下划线。这将调用Python的名称篡改算法,其中类的名称被篡改为属性名称。如果子类无意中包含具有相同名称的属性,这有助于避免属性名称冲突。

注3:并不是每个人都喜欢名称混乱。尽量平衡避免意外名称冲突的需要和高级调用者可能使用的名称。

因此,如果您不希望子类意外地重新定义同名的own方法,请不要使用它。

票数 70
EN

Stack Overflow用户

发布于 2010-08-02 13:49:35

双下划线。它破坏名称的方式,使得它不能简单地通过__fieldName从类外部访问,如果它们是私有的,这是您想要开始的。(尽管访问该字段仍然不是很难。)

代码语言:javascript
复制
class Foo:
    def __init__(self):
        self.__privateField = 4;
        print self.__privateField # yields 4 no problem

foo = Foo()
foo.__privateField
# AttributeError: Foo instance has no attribute '__privateField'

它将改为通过_Foo__privateField访问。但它尖叫着“我是私人的,别碰我”,这总比什么都没有好。

票数 42
EN

Stack Overflow用户

发布于 2010-08-02 13:51:51

双下划线。这就把名字弄乱了。该变量仍然可以访问,但这样做通常不是一个好主意。

使用单下划线表示半私有(告诉python开发人员“只有在绝对必要的情况下才会更改它”),使用双下划线表示完全私有。

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

https://stackoverflow.com/questions/3385317

复制
相关文章

相似问题

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