python - Python中有没有办法(甚至是要求)来表示抽象的中间类?
问题描述
考虑以下一组类:
from abc import ABC, abstractmethod
class GrandParent(ABC):
@abstractmethod
def foo(self):
raise NotImplementedError()
@abstractmethod
def bar(self):
raise NotImplementedError()
class Parent1(GrandParent):
def foo(self):
print("Parent 1")
class Parent2(GrandParent):
def foo(self):
print("Parent 2")
class Child1A(Parent1):
def bar(self):
print("Child 1A")
class Child1B(Parent1):
def bar(self):
print("Child 1B")
这里GrandParent,
Parent1
和Parent2
是抽象类,唯一具体的是Child1A
和Child1B
。但是,pylint
抱怨Parent
s :
W0223: Method 'bar' is abstract in class 'GrandParent' but is not overridden (abstract-method)
我可以理解的原因是,通过查看类定义本身,人们无法理解它应该是一个抽象类。我想知道是否需要使用装饰器或其他东西来明确指出这一点?
一种明显的方法是重新定义一个抽象bar
方法Parent1
,Parent2
但这对我来说听起来不合理(如果有 10 个其他抽象方法GrandParent
需要孩子们覆盖怎么办?,是否应该将所有 10 个都复制粘贴到Parent
吗?)
更新
评论中建议这是一种pylint
特定行为,尚不支持中间隐式 ABC。要摆脱警告(不禁用它),重新定义使用装饰器的抽象方法GrandParent
之一就足够了。确实这解决了问题,但会在多继承场景中导致问题:Parent1
@abstractmethod
from abc import ABC, abstractmethod
class Base(ABC):
@abstractmethod
def foo(self):
raise NotImplementedError()
@abstractmethod
def bar(self):
raise NotImplementedError()
def baz(self):
return 'baz'
def qux(self):
return 'qux'
class C1(Base):
def qux(self):
return super().qux().upper()
# @abstractmethod
# def bar(self):
# raise NotImplementedError()
class C2(Base):
def foo(self):
return 'FOO'
def bar(self):
return 'BAR'
class D(C1, C2):
pass
这C1
是一个中间隐式 ABC,因此pylint
发出警告。然而,D
是一个具体的类。为了摆脱pylint
警告,我们可以取消注释bar
in的重新定义C1
。但是随后D
无法实例化 --- Python 抱怨它bar
是抽象的,C1
而不是在D
.
解决方案
推荐阅读
- wordpress - 如何更改 WordPress 网站主页中的 HTML?
- python - 蟒蛇楼梯(Hackerrank)
- c# - C# Wpf DataGrid 可变列数
- php - 我想使用 jquery 为选择选项添加值和名称,以便它显示 jquery 分配的当前值
- xquery - Xquery 使用 position() 获取元素的数量
- python - tqdm - PyCharm 中带有嵌套 for 循环的多个进度条
- laravel - 在 Laravel 8 中导出 CSV tthrough 数组
- java - 我无法从 Android Studio 中的内部类 onClick 方法启动 Intent
- javascript - Vue JS V-for 不渲染
- r - r 过滤数据帧 group_by,并找到 cumusm