关于python:在抽象类中使用children方法可以吗?Pep8说实例没有成员

Is it ok to use children method in abstract class? pep8 says instance has no member

本问题已经有最佳答案,请猛点这里访问。

我在Visual Studio代码中使用了Pep8,我只是尝试编写一些抽象类。

问题是我得到了错误[pylint] E1101:Instance of 'MyAbstract' has no 'child_method' member,因为pep8没有意识到方法定义得很好,而是在子类中。

为了说明我的问题,这里有一个代码片段,为了清晰起见,它被简化为最小值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyAbstract:

    def some_method(self):
        newinfo = self.child_method()
        # use newinfo

class MyChild(MyAbstract):

    def child_method(self):
        # Do something in a way

class OtherChild(MyAbstract):

    def child_method(self):
        # Do the same thing in a different way

所以我的问题是:

  • 写这样的类可以吗?
  • 你将如何解决这个错误?(禁用错误,使用其他模式…)

澄清

MyAbstract类不应该声明,子类将继承some_method。其思想是在子类实例上使用它。


如果希望MyAbstract是抽象方法child_method的抽象类,python可以在abc模块中表达它:

1
2
3
4
5
6
7
8
9
10
import abc

class MyAbstract(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def child_method(self):
        pass

    def some_method(self):
        newinfo = self.child_method()
        do_whatever_with(newinfo)

您的linter将不再抱怨不存在的方法,作为额外的好处,python将检测到用未实现的抽象方法实例化类的尝试。