假设我们有以下类。
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
在大多数情况下,在这里是最好的事情,但我不能这样做 出于各种原因.
任何想法?
你能不能直接标记 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