You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决步骤

  1. 导入外部子类模块:在调用__subclasses__()前,导入testc2subclass模块,比如在调用代码开头添加:
    import testc2subclass
    
    若是包结构,需确保导入路径正确(如from . import testc2subclass)。
  2. 修正基类语法错误:将init和execute方法缩进至C2Methods类内部,并通过self访问属性。

完成以上操作后,C2Methods.__subclasses__()就会同时返回InternalSubclass和TestC2Subclass了。


内容的提问来源于stack exchange,提问作者Mike Oliver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:40:42