Python中私有名称修改的好处是什么?

cmc*_*nty 13 python name-mangling private-members

Python 为类方法和属性提供私有名称修改.

是否有任何需要此功能的具体情况,或者它只是Java和C++的延续?

请描述一个应该使用Python名称修改的用例,如果有的话?

此外,我对作者仅仅试图防止意外外部属性访问的情况不感兴趣.我相信这个用例与Python编程模型不一致.

Ric*_*dle 25

这部分是为了防止意外的内部属性访问.这是一个例子:

在您的代码中,这是一个库:

class YourClass:
    def __init__(self):
        self.__thing = 1           # Your private member, not part of your API
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我将继承您的库类:

class MyClass(YourClass):
    def __init__(self):
        # ...
        self.__thing = "My thing"  # My private member; the name is a coincidence
Run Code Online (Sandbox Code Playgroud)

如果没有私人名称错误,我意外重复使用您的名字会破坏您的库.

  • 我想我们必须同意在这方面有所不同.恕我直言,一个编写良好的库类有两个API,一个用于该类的直接用户,另一个用于从中继承的类.按照惯例,前者使用没有下划线的名称,后者可以访问单下划线名称.但是这个类仍然有权隐藏它的一些实现细节 - 那些不构成API的一部分 - 远离两种类型的用户.否则,对类的内部工作的更改几乎不可能,因为您无法了解子类如何使用您的成员. (7认同)
  • @Casey:你是对的,你想要对子类可见的成员变量,以及你用单个下划线命名的成员变量.你可以在C++中使它们成为`protected`.但也有成员,你*不希望子类可见,因为它们是你的类的私有实现的一部分(正如你所说,它们受实现变化的影响).正是这些名称的重整是为了.这不是一个想象中的问题; 我实际上完成了我正在谈论的事情,一个库使用单个下划线而不是私人成员的双倍. (5认同)

too*_*php 16

PEP 8:

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

(重点补充)


Len*_*bro -1

名称修改是为了防止意外的外部属性访问。大多数情况下,它是为了确保不存在名称冲突。