如何合并包含具有相同签名的方法的两个Python类?

如何合并包含具有相同签名的方法的两个Python类?,python,api,rest,api-design,Python,Api,Rest,Api Design,我正在开发一个REST客户端库,最近开始研究添加对发送批处理消息的支持 然而,我不喜欢目前的设计。它要求您维护具有相同方法签名的大型客户端和RequestMessage类 我正在寻找一种方法来巩固这两个课程 原始客户端类的方法包含准备和发送请求所需的所有代码: class Client(object): def __init__(self, config): self.request = Request(config, "application/json") def

我正在开发一个REST客户端库,最近开始研究添加对发送批处理消息的支持

然而,我不喜欢目前的设计。它要求您维护具有相同方法签名的大型客户端和RequestMessage类

我正在寻找一种方法来巩固这两个课程

原始客户端类的方法包含准备和发送请求所需的所有代码:

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)
为了添加对批处理消息的支持,我从每个客户机方法中提取了代码的精华,并将其放入一个单独的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()
批处理的使用频率低于客户端,因此我希望使普通客户端界面更易于使用

这里有一个想法,但我不太确定如何实现,或者是否有其他更好的方法:

   >>> 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)

我同意@Karl的观点,但做了一些修改

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)

这样,您就不必检查输入的类型。更易于编写,更易于使用。

Hi Karl-Batch需要能够包含不同的命令——创建顶点、创建边、索引顶点。我将在客户端上设置批处理模式。是的,我可以将客户端子类化为BatchClient,让它将命令添加到批处理列表中,而不是立即发送每个请求。