python - 将上下文和令牌用例组合到通用 ABC 中
问题描述
我在这里有一个基本的ABC:
from abc import ABCMeta, abstractmethod
class StreamingService(object, metaclass=ABCMeta):
@abstractmethod
def search_one(self, q):
pass
@abstractmethod
def supports_url(self, url):
pass
@abstractmethod
def get_title_from_url(self, url):
pass
问题是一些扩展 StreamingService 的类对其调用使用上下文,即
class Context:
def __enter__():
...
def __exit__():
...
def search_one(self, context, q):
...
context = Context()
client.search_one(context, "query")
而其他类只需要一个字符串token。
def search_one(self, token, q):
...
token = "abcdef012345"
client.search_one(token, "query")
我可以让 ABC 中的每个函数都需要一个“上下文”变量,由子类所有者来解释。但是,这感觉就像是草率的代码设计,其意图并不明确,并且违反了“上下文”的标准定义。
我可以使用哪些设计模式来融合这两个用例并使其他使用代码的人清楚?
最终目标是统一开发人员与每个流服务交互的方式,以减少混淆和查找每个单独服务的文档的需要。
代码设计领域之外的建议以及我如何与 API 本身交互的建议也值得赞赏。
解决方案
我的解决方案是将每个 StreamingService 变成它自己的 ContextManager。每个都需要一个'<strong>enter'和'<strong>exit',但实现取决于子类。
具有客户端的子类在进入/退出时初始化并关闭其客户端。那些使用令牌的人在“<strong>enter”上发送他们的令牌请求,而在“<strong>exit”上什么也不做。
推荐阅读
- android - 从 APK 运行时不显示图像
- nsis - 如何使用 NSIS 在卸载期间保存日志
- python - 使用 cmaps 进行散点图
- c# - win2D CanvasControl DrawImage() 通过错误“值不在预期范围内”?
- r - 如何使用geom将三个汇总数据点添加到ggplot而不必具有相同的数据大小?
- python - 如何引用在函数中初始化的列表?(Python)
- docker - 理解 docker create 命令行参数
- python-3.x - 如果前一个指标 R 存在,Python 将值清零
- c++ - 访问冲突写入位置动态分配数组
- css - 我想要可滚动的
在顶部标题的表格中