сначала создайте свой собственный объект класса, наследуя 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
......