从父类内部输入子类

问题描述 投票:0回答:1

假设我们有以下类。

from __future__ import annotations

class BaseSwallow:
    # Can't get the ref to `BaseSwallow` at runtime
    DerivedSwallow = NewType('DerivedSwallow', BaseSwallow) 

    def carry_with(self, swallow: DerivedSwallow):
        self.carry()
        swallow.carry()

    def carry(self):
        pass

class AfricanSwallow(BaseSwallow): pass

godOfSwallows = BaseSwallow()
africanSwallow = AfricanSwallow()

africanSwallow.carry_with(godOfSwallows)  # Should fail at static typing

我想强制执行 carry_with 的实例才会被调用 源于 BaseSwallow所以我用 NewType 以此 如法炮制.

然而, NewType 需要一个对基类对象的引用才能工作,而我在运行时没有访问该对象的权限。在运行时之前,我可以 "访问 "到 BaseSwallow 由于 annotations 模块,但运行时还是会失败。

我知道使用一个抽象基类来实现 BaseSwallow 在大多数情况下,在这里是最好的事情,但我不能这样做 出于各种原因.

任何想法?

python typing mypy
1个回答
0
投票

你能不能直接标记 carry 作为 abstractmethod例如,类似的东西。

import abc

class BaseSwallow:
    def carry_with(self, swallow: BaseSwallow) -> None:
        self.carry()
        swallow.carry()

    @abc.abstractmethod
    def carry(self) -> None:
        raise NotImplementedError('implementation of carry needed')

派生类可以实现该方法,但由于基类没有尝试实例化它 会导致类型检查失败,说: BaseSwallow 是一个抽象类,因为缺少属性 carry

© www.soinside.com 2019 - 2024. All rights reserved.