是否有某种机制强制嵌套接口在 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
实现。
我想创建一个 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
实现。