是否有某种机制强制嵌套接口在 Python 中以抽象 类 实现?

Is there some mechanism to enforce nested interfaces are implemented in abstract classes in Python?

我想创建一个 class,它有一些嵌套的 class,在 Python 中定义了一些契约。一个站得住脚的例子是一个类型化的配置对象。我对此的尝试如下:

from typing import Mapping
from abc import ABCMeta, abstractmethod

class BaseClass(metaclass=ABCMeta):
    # If you want to implement BaseClass, you must also implement BaseConfig
    class BaseConfig(metaclass=ABCMeta):
        @abstractmethod
        def to_dict(self) -> Mapping:
            """Converts the config to a dictionary"""

但不幸的是,我可以实例化 BaseClass 的子 class 而无需实现 BaseConfig:

class Foo(BaseClass):
    pass

if __name__ == "__main__":
    foo = Foo()

有什么方法可以强制子 class 也必须实现内部 class 吗?

目前看来这不可能。最接近的是创建两个抽象classes(分别对应outer和innerclasses),强制实现者为具体的innerclass提供cls构造函数;例如:

from abc import ABCMeta, abstractmethod

class Inner(metaclass=ABCMeta):
    @abstractmethod
    def __str__(self):
        pass

class Outer(metaclass=ABCMeta):
    inner_cls = Inner

    def shout(self, *args, **kwargs):
        inner = self.inner_cls(*args, **kwargs)
        print(f"My inner is {inner}!!!")

class FooInner(Inner):
    def __str__(self):
        return "FooInner"

class FooOuter(Outer):
    inner_cls = FooInner

这需要 Inner 至少有一个 abstractmethod 否则它可以实例化为默认 inner_cls 实现。