我正在开发一个 REST 客户端库,最近开始致力于添加对发送批量消息的支持。
但是,我不喜欢当前的设计。它要求您维护具有相同方法签名的大型 Client 和 RequestMessage 类。
我正在寻找一种方法来整合这两个类。
原始 Client 类的方法包含准备和发送请求所需的所有代码:
class Client(object):
def __init__(self, config):
self.request = Request(config, "application/json")
def create_vertex(self, data):
path = "vertices"
params = remove_null_values(data)
self.request.post(path, params)
为了添加对批处理消息的支持,我提取了每个 Client 方法内的代码的核心,并将其放入单独的 RequestMessage 类中,以便您可以将消息添加到批处理中而不发送它,直到您准备好了:
class Client(object):
def __init__(self, config):
self.request = Request(config, "application/json")
self.message = RequestMessage(config)
def create_vertex(self, data):
message = self.message.create_vertex(data)
return self.request.send(message)
# ...more REST client methods...
def batch(self, messages):
path = "batch"
params = messages
return self.request.post(path, params)
class RequestMessage(object):
def __init__(self, config):
self.config = config
def create_vertex(self, data):
path = "vertices"
params = remove_null_values(data)
return POST, path, params
# ...more REST client methods...
但我不喜欢这种设计,因为现在您必须维护 Client 和 RequestMessage 类——两个具有相同签名的大类。
Batch 类如下所示:
class Batch(object):
def __init__(self, client):
self.client = client
self.messages = []
def add(self, message):
self.messages.append(message)
def send(self):
return self.client.batch(self.messages)
以下是在服务器上创建顶点的示例用法:
>>> client = Client(config)
>>> vertex = client.create_vertex({'name':'James'})
以下是在服务器上创建一批顶点的示例用法:
>>> message1 = client.message.create_vertex({'name':'James'})
>>> message2 = client.message.create_vertex({'name':'Julie'})
>>> batch = Batch(client)
>>> batch.add(message1)
>>> batch.add(message2)
>>> batch.send()
Batch 的使用频率低于 Client,因此我想让普通的 Client 界面最易于使用。
这是一个想法,但我不太确定如何实现它,或者是否有其他更好的方法:
>>> vertex = client.create_vertex(data)
>>> message = client.create_vertex(data).message()
最佳答案
我个人更喜欢这样的 API:
client.create_vertex({'name':'James'}) # single
client.create_vertex([{'name':'James'}, {'name':'Julie'}]) # batch
这样你就可以使用完全相同的函数,只是给它更多的数据。典型用法可能看起来更像是:
batch = []
batch.append({'name':'James'})
batch.append({'name':'Julie'})
client.create_vertex(batch)
关于python - 如何合并两个包含具有相同签名的方法的Python类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9586214/