Python跨文件调用双前导下划线开头方法报错如何解决?
报错原因
Python 存在**名称改写(Name Mangling)**机制:对仅前缀带双下划线、后缀不带双下划线的标识符,会自动修改其存储名称,避免外部直接访问这类设计为私有属性/方法的成员。
你在legacy.py中定义的def __check()符合名称改写的触发条件,导入模块后该方法的实际名称被修改为_legacy__check,直接调用legacy.__check()自然会触发你遇到的报错:
AttributeError: module 'folder.legacy' has no attribute '__check'
解决方案
方案1(优先推荐):调整legacy.py的方法命名
如果有权限修改legacy.py的代码,把双下划线前缀改为单下划线即可,单下划线是社区约定的私有标识,不会触发名称改写:
# legacy.py修改后 def _check(): ... return True if ... else False
main.py中直接调用修改后的方法:
from folder import legacy def main(): print(legacy._check())
方案2(无法修改legacy.py时使用):调用改写后的名称
如果不能修改legacy.py的源码,直接使用改写后的名称调用即可:
from folder import legacy def main(): print(legacy._legacy__check())
内容的提问来源于stack exchange,提问作者Jared Dominic Caraan
相关产品推荐
相关产品推荐

