【发布时间】:2018-04-20 13:08:04
【问题描述】:
我正在为 SOAP API 构建 Python API 包装器。我需要设计一组 API 类,其中包含不同数量的动词动作(add、get、list、remove 等)。此外,由于 SOAP API 中对象的性质,这些对象还可能包含来自(sync、options、apply、restart 和 reset)子集的其他方法。每个动词的内部意味着很少有情况需要覆盖并且可以很容易地被继承。我的问题是某些端点是单例的,或者出于某种原因可能只支持这些方法的一个子集。意思是:
端点A
-
仅限
get
端点B
-
add,get,list,remove -
apply和restart
端点C
-
仅限
add和get
端点D
-
add,get,list,remove -
apply,restart,reset
我有超过 100 个端点。最符合以下共同主题:
-
add,get,list,remove
不过,也有很多例外。
在我当前的设计中,所有端点都使用Client 属性进行实例化,该属性控制在线上的 SOAP 连接、请求和响应。我正在寻找一种方法来灵活地创建类设计,允许我在不需要复制代码或无意中继承 API 端点不支持的方法的情况下插入方法。
平面继承是有问题的,因为我没有足够的灵活性来处理方法的所有排列。
BaseAPI(object):
def __init___(self, client):
self.client = client
ChildAPI(BaseAPI):
def __init___(self, client):
super().__init__(client)
def get(self, **kwargs):
soap_method = methodcaller("".join(["get", self.__class__.__name__]), **kwargs)
resp = soap_method(self.client.service)
return resp
def list(self, **kwargs):
soap_method = methodcaller("".join(["list", self.__class__.__name__]), **kwargs)
resp = soap_method(self.client.service)
return stuff
# same for add and remove...
EndpointA(BaseAPI):
def __init___(self, client):
super().__init__(client)
# now i have a problem as i only wanted the get method...
EndpointD(BaseAPI):
def __init___(self, client):
super().__init__(client)
# I have all the methods I wanted...
我在考虑 mixins,但正如您所见,动词方法依赖于公共客户端。据我了解,mixin 应该只继承自object。
谁能建议如何布置我的类设计以尽可能促进重用,并避免缺乏灵活性?
【问题讨论】:
标签: python-3.x inheritance multiple-inheritance