python如何解析类中的private(双下划线)方法?

时间:2019-01-30 13:26:12

标签: python cpython python-internals private-methods

考虑以下课程

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()在定义类后运行时,由于名称混用而失败。 python解释器如何能够在方法内部解析Foo.__is()而在类外部无法解析?

2 个答案:

答案 0 :(得分:2)

在类内部以__开头的名称进行名称修饰是通过仅在类内部将名称重写为修饰形式来实现的。因此,您班级中的Foo.__is_Foo__is所取代,而__dict__现在出现在班级__is中。该属性可以在类的内部或外部访问,因此没有私有保护。但是替换后int A = new Int(); 的名称在任何地方都不存在(我认为),这就是为什么它不能从外部使用的原因。

从Python帮助中:

  

“ __ *”      类私有名称。在此类别中使用的名称      类定义的上下文,被重写以使用变形的形式      以避免在base和private的“私有”属性之间发生名称冲突      派生类。请参阅“标识符(名称)”部分。

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

答案 1 :(得分:-2)

您可以将类视为带有一些口哨声的命名空间。

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

为说明“命名空间”的想法,您可以做一些奇怪的事情,例如

class A:
    def insane():
        return 42

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