Python调试类中私有方法:无法以原名称调用的问题求助
调试控制台调用pandas apply时无法使用类私有方法原名称的原因
核心原因:Python私有方法的名称改编机制,以及编译代码与动态执行代码的差异
Python私有方法的名称改编(Name Mangling)
类中以__开头的方法,Python会在编译类定义阶段自动将其名称改编为_类名__方法名,比如示例中的__private_method会被替换为_Foo__private_method。这个机制用于避免子类意外覆盖父类私有方法。- 正常运行时,类内部代码里的
self.__private_method会被编译器直接替换为self._Foo__private_method,传给pandas apply的是正确的改编后方法对象,因此调用完全正常。
- 正常运行时,类内部代码里的
调试控制台的动态执行特性
调试控制台执行的代码是动态解释的,不会像编译类那样自动对__开头的名称做改编:- 当你在类方法的断点帧中直接输入
self.__private_method时,调试器会模拟类内部的命名空间环境,帮你自动转换名称,返回_Foo__private_method对应的绑定方法对象,所以能正常输出。 - 但当你把
self.__private_method作为参数传给pandas apply时,apply内部处理方法对象时会读取它的__name__属性(值仍为__private_method)。如果apply在某些逻辑中尝试通过实例(self)和这个方法名查找属性(比如getattr(self, '__private_method')),就会因为实例上只有_Foo__private_method属性而抛出AttributeError。
- 当你在类方法的断点帧中直接输入
使用改编后名称正常的原因
当你显式传入self._Foo__private_method时,apply直接调用这个已获取到的方法对象,不需要通过方法名去实例上查找,因此能正常执行。即使方法的__name__还是__private_method,也不会影响直接调用方法对象的逻辑。
内容的提问来源于stack exchange,提问作者sssyzzz
相关产品推荐
相关产品推荐

