python переопределить метод класса API с другим именем - PullRequest
0 голосов
/ 15 февраля 2020

сначала создайте свой собственный объект класса, наследуя 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 в методе «error», но можно ли направить метод API «error» в другой определите c имя как "xapi_error"? В моей программе немного API, поэтому я хочу объявить их четко. я просто не хочу, чтобы self.error был доступен в классе mainobject.

, поэтому создайте объект 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' не определено

У меня был некоторый успех с этим @ подходом долго go, но забудьте, что это такое и как его использовать ...

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

1 Ответ

0 голосов
/ 15 февраля 2020

Можете ли вы обработать первый вызов 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(...)

в своей функции ошибки, она не будет вызывать переопределенный метод.

...