gpt4 book ai didi

python - "Passing"在Python中通过子类进一步实现抽象方法?

转载 作者:行者123 更新时间:2023-12-02 09:53:30 26 4
gpt4 key购买 nike

抱歉,我想不出更好的方式来表达标题!

基本上,我想要一个抽象基类,然后是一个没有实现抽象方法的子类,然后是一个那个的子类,实现了 实现该方法。通过一个例子可能会更容易:

import abc
class A(abc.ABC):
def __init__(self, some_var):
self.some_var = some_var

@abc.abstractmethod
def some_method(self):
pass

class B(A):
def some_b_method(self):
print("Hello")

class C(B):
def some_method(self):
self.some_b_method()
print(self.some_var)

c = C('world')
c.some_method()

这就是我期望的工作方式,但是对于上面的 B 类,Pylint 报告 warning 0223 .

如果我修改 B 类以包含以下内容,Pylint 不会给我带来任何问题,但代码的重复似乎是错误的:

@abc.abstractmethod
def some_method(self):
pass

有“正确”的方法吗?我找不到答案。

最佳答案

如果您立即不打算实现该方法,则不应使用抽象方法定义抽象基类。更好的选择是定义不带抽象方法的 ABC,并定义一个包含该方法的 mixin 类。您可以从 A 类 继承 B 类,然后从 B 类 和 mixin 继承 C 类

import abc
class A(abc.ABC):
def __init__(self, some_var):
self.some_var = some_var

class MixinA(abc.ABC):
@abc.abstractmethod
def some_method(self):
pass

class B(A):
def some_b_method(self):
print("Hello")

class C(B, MixinA):
def some_method(self):
self.some_b_method()
print(self.some_var)

c = C('world')
c.some_method()

# returns:
Hello
world

# list the methods:
[m for m in dir(c) if not m.startswith('_')]
# returns:
['some_b_method', 'some_method', 'some_var']

关于python - "Passing"在Python中通过子类进一步实现抽象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46801226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com