代码正常运行却触发Pylint E1101(no-member)错误的解决方法
解决Pylint E1101(no-member)错误的几种方法
你的代码能正常运行,但Pylint报错是因为父类A中没有定义_get_matrix方法,而A的__init__里调用了这个方法,Pylint无法识别子类中实现的该方法。以下是几种可行的修改方案:
方案一:在父类A中定义抽象方法(推荐)
在A类中添加一个抛出NotImplementedError的_get_matrix方法,既让Pylint识别到该成员存在,又能强制子类必须实现这个方法,避免遗漏:
class A(): def __init__(self, <SOME_VARIABLES>): self.matrix = self._get_matrix() def _get_matrix(self): raise NotImplementedError("子类必须实现_get_matrix方法") class B(A): def __init__(self, <SOME_VARIABLES>): super().__init__(<SOME_VARIABLES>) def _get_matrix(self): # 这里写B类的具体实现逻辑 return some_matrix class C(A): def __init__(self, <SOME_VARIABLES>): super().__init__(<SOME_VARIABLES>) def _get_matrix(self): # 这里写C类的具体实现逻辑 return another_matrix
方案二:使用抽象基类(更规范)
借助Python的abc模块将A定义为抽象基类,用@abstractmethod装饰_get_matrix,这样不仅能解决Pylint错误,还能防止直接实例化A类:
from abc import ABC, abstractmethod class A(ABC): def __init__(self, <SOME_VARIABLES>): self.matrix = self._get_matrix() @abstractmethod def _get_matrix(self): pass class B(A): def __init__(self, <SOME_VARIABLES>): super().__init__(<SOME_VARIABLES>) def _get_matrix(self): # B类的具体实现 return some_matrix class C(A): def __init__(self, <SOME_VARIABLES>): super().__init__(<SOME_VARIABLES>) def _get_matrix(self): # C类的具体实现 return another_matrix
方案三:添加Pylint忽略注释(临时快速解决)
如果只是想快速消除Pylint的错误提示,不需要强制子类实现的约束,可以在调用_get_matrix的位置添加忽略注释:
class A(): def __init__(self, <SOME_VARIABLES>): # pylint: disable=no-member self.matrix = self._get_matrix() class B(A): def __init__(self, <SOME_VARIABLES>): super().__init__(<SOME_VARIABLES>) def _get_matrix(self): # B类的具体实现 return some_matrix class C(A): def __init__(self, <SOME_VARIABLES>): super().__init__(<SOME_VARIABLES>) def _get_matrix(self): # C类的具体实现 return another_matrix
方案对比
- 方案一和方案二属于规范的面向对象设计,能避免子类遗漏实现方法,适合长期维护的项目;
- 方案三是临时解决方案,适合快速调试或小型项目使用,但没有代码约束能力。
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

