Python中的私有变量和方法[重复]

Posted

技术标签:

【中文标题】Python中的私有变量和方法[重复]【英文标题】:Private Variables and Methods in Python [duplicate] 【发布时间】:2011-03-24 01:18:45 【问题描述】:

可能重复:The meaning of a single- and a double-underscore before an object name in Python

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

【问题讨论】:

谢谢大家。我发现了另一个有用的话题。 ***.com/questions/70528/… 更好:***.com/questions/1301346/… 【参考方案1】:

请注意,Python 中没有“私有方法”之类的东西。双下划线只是名称修饰:

>>> class A(object):
...     def __foo(self):
...         pass
... 
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()

因此,__ 前缀在您需要发生重整时很有用,例如不与继承链上或下的名称发生冲突。对于其他用途,单下划线会更好,恕我直言。

编辑,关于__、PEP-8 的混淆,这一点非常清楚:

如果你的类打算被子类化,并且你有属性 您不想让子类使用,请考虑将它们命名为 双前导下划线,没有尾随下划线。这调用 Python 的名称修饰算法,其中类的名称为 融入属性名称。 这有助于避免属性名称 碰撞应该子类不经意地包含与 同名。

注 3:不是每个人都喜欢名字修饰。尝试平衡 需要避免与潜在用途的意外名称冲突 高级调用者。

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

【讨论】:

【参考方案2】:

双下划线。它以这样一种方式破坏名称,以至于不能简单地从类外部通过__fieldName 访问它,如果它们是私有的,这就是你想要开始的。 (尽管访问该领域仍然不是很困难。)

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 访问。但它尖叫着“我是私人的,不要碰我”,这总比没有好。

【讨论】:

【参考方案3】:

因为那是编码约定。 请参阅here 了解更多信息。

【讨论】:

OP 询问使用哪一个。不是为什么。【参考方案4】:

双下划线。这破坏了名字。仍然可以访问该变量,但这样做通常是个坏主意。

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

【讨论】:

不太对。单个下划线表示您正在篡改对象的未记录属性,这些属性可能会发生变化,并且您可能会破坏对象维护的不变量,因此如果您决定破坏对象封装,您应该准确了解您在做什么。

以上是关于Python中的私有变量和方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python的私有变量和私有方法

Python的私有变量和私有方法

类的私有变量和私有方法

Python 私有化

在python中继承私有变量[重复]

python 类的私有变量和私有方法