python 如何解析 class 中的私有(双下划线)方法?

How python resolves private(double underscore) methods inside a class?

考虑以下 class

class Foo(object):

    @staticmethod
    def __is():
        print('__is')

    def m(self):
        Foo.__is()  # executes


Foo.__is()  # fails because of mangling

print(Foo.__dict__.keys())

Foo.__is() 在定义 class 后为 运行 时,由于名称管理而失败。 python 解释器如何能够解析 Foo.__is() 内部方法而不是 class 外部?

您可以将 类 想象成带有一些口哨的命名空间。

口哨之一是能够在没有 _class__method 的情况下解决 __methods 内部问题。这与自动将实例作为第一个参数传递给方法的 "magic" 没有什么不同(您的常规 self

为了说明 "namespace" 的想法,你可以做一些奇怪的事情,比如

class A:
    def insane():
        return 42

    for _ in range(5):
        print(insane()

class 中以 __ 开头的名称的名称重整是通过将此名称重写为错位形式实现的,仅在 class 中。因此,class 中的 Foo.__is 被 class __dict__ 中的 _Foo__is 取代。该属性在 class 内部或外部都可以访问,因此没有私有保护。但是替换后 __is 名称在任何地方都不存在(我认为),这就是它在外部不起作用的原因。

来自 Python 帮助:

"__*" Class-private names. Names in this category, when used within the context of a class definition, are re-written to use a mangled form to help avoid name clashes between “private” attributes of base and derived classes. See section Identifiers (Names).

另请参阅我对您代码段中错误的评论。