如何解决python实现中的联合与继承
假设我们有这个类。
class MyConfig():
config_type : SomeEnum
retries: int
context: Context
此上下文取决于类型的值,这意味着上下文取决于其值。哪种 Context 实现最好?为什么一个比另一个更好。
class MySpecificContext:
value: int
name: str
class OtherUnrelatedContext:
length:int
position: int
Contex = Union[MySpecificContex,OtherUnrelatedContext]
或
class Context:
pass
class MySpecificContext(Context):
value: int
name: str
class OtherUnrelatedContext(Context):
length:int
position: int
更具体地说。假设您有一个配置类,该配置将保存用于配置进程的数据。此过程将包含一些与所有配置相关的内容,例如 retries
值。但是,预计基于 config_type
需要额外的上下文。这与特定的配置类型高度相关。请注意,这些类只保存数据,预计它们将来不会实现任何行为。但是,预计 SomeEnum 枚举将被扩展,并且将在某个时候添加更多“上下文”。将我的配置视为不可变的。
解决方法
以下是我可能的处理方式:
from enum import Enum
from typing import Generic,NamedTuple,TypeVar,Union
class MySpecificContext(NamedTuple):
value: int
name: str
class OtherUnrelatedContext(NamedTuple):
length: int
position: int
Context = Union[MySpecificContext,OtherUnrelatedContext]
_T = TypeVar("_T",bound=Context)
class SomeEnum(Enum):
MY_SPECIFIC = 1
OTHER_UNRELATED = 2
config_types = {
MySpecificContext: SomeEnum.MY_SPECIFIC,OtherUnrelatedContext: SomeEnum.OTHER_UNRELATED,}
class MyConfig(Generic[_T]):
def __init__(self,context: _T,retries: int):
self.retries = retries
self.context = context
@property
def config_type(self) -> SomeEnum:
return config_types[type(self.context)]
对您所谈论的两个属性之间的类型关系进行编码很棘手;如果没有不同的 MyConfig
子类,我想不出任何方法来做到这一点。另一方面,如果你可以从另一个派生出一个,首先让它们成为独立的属性是没有意义的,这就是为什么我刚刚把 config_type
变成了一个派生自的属性config
。 (这是假设您已经使用了这个接口——我会去掉枚举和映射,直接使用上下文类型,以便维护更少的代码。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。