如何修补内部使用其他实例方法的外部库的实例方法?
How to monkey patch an instance method of an external library that uses other instance methods internally?
我需要在我正在使用的库的实例方法中修补逻辑。
为简洁起见的示例代码。 process
方法按原样使用 Client
库的 connect
方法,但我想修改它以使用不同的逻辑而不是 parsing_logic_1。最好的方法是什么?如果我在 Usage
class?
中添加新的 _patched_connect
方法,如何访问 class 变量,如 url
class Client:
def __init__(self, url)
self.url = url
def connect (self):
if self.url == 'a':
self._parsing_logic_1()
if self.url == 'b':
self._parsing_logic_2()
else:
pass
def _parsing_logic_1(self):
pass
def _parsing_logic_2(self):
pass
def send(self):
pass
# ----separate file --------
class Usage:
def __init__(self, client: Client):
self.client = client
def process(input):
self.client.connect() # the connect method should use a different parsing logic for one case
self.client.send()
您需要导入您的 class 并用修改后的方法替换该方法。
在 python 中,您可以根据需要动态替换方法。
示例:
from x.y.z import Client
def mynewconnect(self):
# your code here
self.url = "..."
pass
Client.connect = mynewconnect
我需要在我正在使用的库的实例方法中修补逻辑。
为简洁起见的示例代码。 process
方法按原样使用 Client
库的 connect
方法,但我想修改它以使用不同的逻辑而不是 parsing_logic_1。最好的方法是什么?如果我在 Usage
class?
_patched_connect
方法,如何访问 class 变量,如 url
class Client:
def __init__(self, url)
self.url = url
def connect (self):
if self.url == 'a':
self._parsing_logic_1()
if self.url == 'b':
self._parsing_logic_2()
else:
pass
def _parsing_logic_1(self):
pass
def _parsing_logic_2(self):
pass
def send(self):
pass
# ----separate file --------
class Usage:
def __init__(self, client: Client):
self.client = client
def process(input):
self.client.connect() # the connect method should use a different parsing logic for one case
self.client.send()
您需要导入您的 class 并用修改后的方法替换该方法。 在 python 中,您可以根据需要动态替换方法。
示例:
from x.y.z import Client
def mynewconnect(self):
# your code here
self.url = "..."
pass
Client.connect = mynewconnect