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).
另请参阅我对您代码段中错误的评论。
考虑以下 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).
另请参阅我对您代码段中错误的评论。