python重写具有不同名称的api类方法

问题描述 投票:0回答:1

首先,创建我自己的类对象继承api

class mainobject1(XAPI):
    def __init__(self):
        XAPI.__init__(self)
        self.count = 0
        # built-in to run api
        self.run()
    # default api method name
    def error(self, regId, errorCode, errorString):
        print("Error:", errorCode)
        self.count += 1

这使我可以使用“错误”方法访问self.count,但是可以将API方法“错误”定向到其他特定名称,例如“ xapi_error”吗?我的程序中几乎没有api,因此我想清楚地声明它们。我只是不想在mainobject类中访问self.error。

因此,请单独创建一个api对象

class myapi(XAPI):
    def __init__(self):
        XAPI.__init__(self)      
    # default api method name  
    def error(self, regId, errorCode, errorString):
        print("Error:", errorCode)
        # self.count += 1 # not working here
class mainobject2():
    def __init__(self):
        self.api = myapi()    
        self.count = 0
        # built-in to run api
        self.api.run()

此方法不会有命名问题,但不能直接访问我自己的类变量self.count。

然后我尝试了以下操作:

......
class mainobject2():
    ......
    # Failed approach
    @self.api.error # <------ ERROR
    def xapi_error(self, regId, errorCode, errorString):
        ......

NameError:未定义名称'self'

我很早以前就通过这种@方法取得了一些成功,但是忘记了它是什么以及如何使用它...

......
import ctypes
class mainobject2():
    # Failed approach
    def RegCallback(self):
        def xapi_error(None, regId, errorCode, errorString):
            ......
        self.xapi_ErrorAddr = PYFUNCTYPE(None, c_char_p)(xapi_error)
        self.app.error(self.xapi_ErrorAddr) # <------ ERROR

TypeError:error()缺少2个必需的位置参数:'errorCode'和'errorString']

我能够使用ctypes将dll回调映射到我的类...我想知道python回调是否有类似的东西...

最终,我的结构:

mainobject(self)
├── objectx (self)
│      └── xapi
├── objecty (self)
│      └── yapi
......

self params彼此共享,因此可以在任何地方访问。所以我希望,在线程代码中,它将是:

import XAPI
......
class objectx():
    def __init__(self):
        self.xapi = myxapi()
        self.xcount = 0
        # built-in to run api
        self.xapi.run()
    # answer to this question
    ......
    # then finally
    def xapi_error(self, regId, errorCode, errorString):
        print("Error:", errorCode)
        self.xcount += 1
    ......
python python-3.x callback ctypes
1个回答
0
投票

您可以使用输入处理第一个error()调用吗?

然后您可以执行以下操作:

def error(self, regId, errorCode, errorString):
        print("Error:", errorCode)
        self.count += 1 # you can remove this and put it in another function
        if errorCode == 1: # whatever the error codes are
            self.xapi_error(.....)
        elif errorCode == 2:
            self.app_error(....)
        else:
            super().error(....)

def xapi_error(....):
    pass

def app_error(...):
    pass

这是您要找的吗?

如果您不拨打电话

super().error(...)

在您的错误函数中,它不会调用重写的方法。

© www.soinside.com 2019 - 2024. All rights reserved.