具有2个继承调用函数的Python超类

问题描述

我正尝试使用其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'

引擎盖下(正在删除init功能...)

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}}方法没有被调用。 RequestClientSubscriptionClient都是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