【发布时间】:2021-05-13 00:18:27
【问题描述】:
我正在学习并尝试为一些第三方API编写python api客户端
为简单起见:
我有 2 个类:Session、EndpointGroup:
class Session:
def __init__(self, token=None):
self.token = token
self.group1 = EndpointGroup
class EndpointGroup:
@classmethod
def ping(cls, token, **kwargs):
return f'Calling ping() with params: {kwargs} and token {token}'
我有许多 EndpointGroups,其中包含同类别的 api 调用。
我想让最终用户调用这样的方法:
session = Session(token='123')
r = session.group1.ping(data='somedata') # Calling ping with params: {'data':'somedata'} and token 123
我想自动/隐式地将令牌传递给可调用对象,这样用户就不必在每次调用时都传递给可调用对象,例如 session.group1.ping(data='somedata', token=session.token)
有“内置”解决方案吗?因为使用 _getattribute_ 我只能访问 EndpointGroup 类,但不能访问被调用的方法。
我已经尝试过:
- 使用 _getattribute_ 创建传递会话/令牌的 EndpointGroup 实例(不喜欢解决方案,因为它为每个会话创建了太多实例)
- 让 Session 继承 EndpointGroup 方法,但后来我失去了像 session.groupN.method_X 到 session.method_X 这样的理想“接口”
- 在 EndpointGroup 类中设置 attr 'token' 并在每次调用时更改它,以便方法可以访问当前调用者的此令牌(会话)(不喜欢此解决方案,因为这样我将无法异步工作)李>
【问题讨论】:
-
“不喜欢解决方案,因为它为每个会话创建了太多实例”我不确定我是否理解这个问题
-
您的第一次尝试可能是正确的道路。但是,不是每次调用
EndpointGroup时都创建一个新实例,而是要“记忆”它,以便如果给定参数已经存在一个现有对象,它可以返回一个现有对象。 (即,如果x == y,则EndpointGroup(x) is EndpointGroup(y)为真。) -
@chepner 目前我有使用这种方式的代码,但对我来说似乎是错误的。例如:每个 1 个实例会话有 20 个 EndpointGroups 实例。因此,如果某个假设的 Web 服务将有 1000 个会话,那么它将有 20000 个端点组实例。这种情况似乎不对
标签: python oop async-await