问题描述
我正尝试使用其websocket封装客户端rest api,如下所示:
class Client(RequestClient,SubscriptionClient):
def __init__(self,api_key,secret_key):
super().__init__(api_key=api_key,secret_key=secret_key)
def subscribe_event(self,callback,error_handler=None):
super().subscribe_event(callback,error_handler)
def callback(msg):
print(msg)
def error(e):
print(e.error_code + e.error_message)
因此,当我直接致电SubsciptionClient并执行以下操作时:
client = SubscriptionClient(api_key=api_key,secret_key=secret_key)
client.subscribe_event(callback,error)
我没问题。
但是当我这样做
client = Client(api_key=api_key,error)
我得到了错误:
AttributeError:“客户端”对象没有属性 'websocket_request_impl'
class SubscriptionClient():
def __init__(self,**kwargs):
api_key = None
secret_key = None
if "api_key" in kwargs:
api_key = kwargs["api_key"]
if "secret_key" in kwargs:
secret_key = kwargs["secret_key"]
self.websocket_request_impl = WebsocketRequest(api_key)
def subscribe_event(callback,error):
request = self.websocket_request_impl.subscribe_event(callback,error_handler)
self.__create_connection(request)
class RequestClient(object):
def __init__(self,**kwargs):
api_key = None
secret_key = None
if "api_key" in kwargs:
api_key = kwargs["api_key"]
if "secret_key" in kwargs:
secret_key = kwargs["secret_key"]
有什么想法请初始化我的超类时我做错了吗?
解决方法
从错误输出中可以明显看出,__init__()
的{{1}}方法没有被调用。 RequestClient
和SubscriptionClient
都是RequestClient
的子类。您可以使用以下方法进行验证:
object
您正在处理所谓的print(issubclass(RequestClient,object))
print(issubclass(SubscriptionClient,object))
# True
# True
。您创建的结构可视化为:
cooperative multiple-inheritance
要解决此问题,您需要在每个子类的 object
/ \
/ \
RequestClient SubscriptionClient
\ /
\ /
Client
方法内调用父类的__init__()
方法。
__init__()
由于class SubscriptionClient:
def __init__(self,**kwargs):
super().__init__()
class RequestClient:
def __init__(self,**kwargs):
super().__init__(**kwargs)
class Client(RequestClient,SubscriptionClient):
def __init__(self,api_key,secret_key):
super().__init__(api_key=api_key,secret_key=secret_key)
在RequestClient
声明中的SubscriptionClient
之前列出,因此关键字参数将首先传递给Client
而不是RequestClient
。
SubscriptionClient