我有一个大班分成混合:
class MyObject(MyObjectFilesMixin, MyObjectProcessingMixin, ...):
def __init__(self, value):
self.value = self.preprocess(value)
混合是:
class MyObjectFilesMixin:
def load_from_file(cls, filename):
return ...
现在我想在任何地方添加打字:
class MyObjectFilesMixin:
def load_from_file(cls, filename: str) -> MyObject:
return ...
class MyObjectProcessingMixin:
def preprocess(self: MyObject, value: bytes):
return value # логика опущена
def append(self: MyObject, other: MyObject):
self.value += other.value
但这会导致循环依赖。当然,你可以创建某种视图类MyObjectBase
(遵循依赖倒置的原则),这样主类MyObject
就可以继承这个基类,mixins在方法中使用它作为参数/结果类型,但还是会很笨拙类型。这怎么能解决?
我有点想念 C++ 头文件/源文件
没有使用 cls 和 self 类型提示,因为已经很清楚 self 是被调用类的对象的实例,而 cls 是定义此类方法的类对象(只是不要忘记@classmethod 装饰器)
找到了一种无需重复代码、协议等的方法,DRY!我的解决方案很简单:
除了现在弹出警告之外,显然 MyPy 不希望从父级接收子级:
但对于 IDE 和 MyPy 可见和理解的方法和类型来说,这是一个很小的代价!