继承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
相关产品推荐
相关产品推荐

