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

继承Generic类报错AttributeError:缺少__parameters__属性——父类未调用__init_subclass__

解决第三方类未调用super().__init_subclass__导致泛型类初始化失败的问题

问题根源

你遇到的AttributeError: type object 'Mine' has no attribute '__parameters__',本质是因为ThirdParty类的__init_subclass__方法没有调用super().__init_subclass__,导致继承链中Generic类的初始化逻辑未被执行。Generic依赖__init_subclass__来为泛型类生成__parameters__属性,缺少这个属性会导致使用Mine[int]这类泛型实例化时出错。

而你尝试直接调用Generic.__init_subclass__(cls)时报错,是因为Generic.__init_subclass__是类方法,通过类名调用时Python会自动将类本身作为第一个参数传入,手动传入cls会导致参数数量过载。

解决方案

方案一:手动调用父类逻辑并修正参数传递

在Mine类中重写__init_subclass__,先执行ThirdParty的初始化逻辑,再调用Generic的__init_subclass__(不需要手动传cls):

from typing import Generic, TypeVar
T = TypeVar("T")

class ThirdParty:
   def __init_subclass__(cls):
      ...  # 第三方类原有逻辑
  
class Mine(ThirdParty, Generic[T]):
    def __init_subclass__(cls):
        # 执行ThirdParty的初始化逻辑
        ThirdParty.__init_subclass__(cls)
        # 调用Generic的初始化,类方法自动绑定cls,无需手动传入
        Generic.__init_subclass__()

class Sub(Mine[int]):
   ...

方案二:兼容带关键字参数的场景

如果ThirdParty的__init_subclass__接收关键字参数(比如**kwargs),需要同步传递参数:

class ThirdParty:
   def __init_subclass__(cls, **kwargs):
      ...  # 第三方类原有逻辑
  
class Mine(ThirdParty, Generic[T]):
    def __init_subclass__(cls, **kwargs):
        ThirdParty.__init_subclass__(cls, **kwargs)
        Generic.__init_subclass__()

验证效果

修改后,Sub(Mine[int])可以正常实例化,Generic的初始化逻辑会为Mine生成__parameters__属性,解决原有的AttributeError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 23:12:37