Python中__subclasses__仅识别内部子类,外部子类未被检测问题咨询
问题:subclasses()仅返回内部子类,外部子类不被识别
我定义了一个基类和内部子类,在相邻文件中还有一个继承自该基类的外部子类,但调用基类的__subclasses__()方法时,只返回内部子类,外部子类不在结果里。相关代码如下:
c2base.py(基类与内部子类)
class C2Methods(object): _instruction = {} _request = {} _paramter = {} _data = {} _responsedata = {} # 注意:此处init和execute方法无缩进,不属于C2Methods类,属于语法错误 def init(self, instruction, request, parameter, data): _instruction = instruction _request = request _paramter = parameter _data = _data def execute(self, instruction, request, parameter, data): print('execute') _responsedata = {} return (_responsedata) class InternalSubclass(C2Methods): pass
testc2subclass.py(外部子类)
from c2base import C2Methods class TestC2Subclass(C2Methods): def execute(self, instruction, request, parameter, data): print('TestC2Subclass.execute()') _responsedata = {} return (_responsedata)
调用代码
import c2base c2subclasses = c2base.C2Methods.__subclasses__() print('XXXXXXXXXXXXXXXXXXXXXXX c2base subclasses', c2subclasses) for cls in c2subclasses: if executeScript == cls.__name__: responsedata = {} responsedata = cls.execute(cls, instruction_row, request, {}, {})
控制台输出
executeScript = TestC2Subclass ++++++++++++++ executeScript ++++++++++++++ XXXXXXXXXXXXXXXXXXXXXXX c2base subclasses [<class 'correlator.api.methods.c2base.InternalSubclass'>]
原因与解决方法
核心原因
Python的__subclasses__()方法只会返回已加载到内存中的子类。外部子类TestC2Subclass所在的testc2subclass模块如果未被导入执行,Python解释器完全不知道这个子类的存在,自然不会出现在__subclasses__()的结果里。
额外代码错误修复
c2base.py存在语法错误:init和execute方法没有缩进,不属于C2Methods类,这会导致基类缺失这两个方法,子类继承后会出现调用问题。需要将方法缩进至类内部,同时用self访问实例属性(避免局部变量覆盖类属性):
class C2Methods(object): _instruction = {} _request = {} _paramter = {} _data = {} _responsedata = {} def init(self, instruction, request, parameter, data): self._instruction = instruction self._request = request self._paramter = parameter self._data = data def execute(self, instruction, request, parameter, data): print('execute') self._responsedata = {} return self._responsedata
解决步骤
- 导入外部子类模块:在调用
__subclasses__()前,导入testc2subclass模块,比如在调用代码开头添加:
若是包结构,需确保导入路径正确(如import testc2subclassfrom . import testc2subclass)。 - 修正基类语法错误:将
init和execute方法缩进至C2Methods类内部,并通过self访问属性。
完成以上操作后,C2Methods.__subclasses__()就会同时返回InternalSubclass和TestC2Subclass了。
内容的提问来源于stack exchange,提问作者Mike Oliver
相关产品推荐
相关产品推荐

