我正试图应用猴子补丁来修复一个问题。然而,问题是它创建了递归。
库代码
base_hook.py
class BaseHook(object):
def __init__(self, source):
pass
ssh_hook.py
class SSHHook(BaseHook):
def __init__(self, source, timeout=10):
super(SSHHook, self).__init__(source)
def get_conn(self):
print("SSH Hook")
猴子修补
class CustomSSHHook(SSHHook):
def __init__(self):
super(CustomSSHHook, self).__init__(
source="abc",
timeout=20
)
def get_conn(self):
try:
print("custom ssh Hook")
return super(CustomSSHHook, self).get_conn()
except Exception as e:
print("retry mechanism")
raise e
initpy
print "running monkey patching ssh hook get_conn"
ssh_hook.SSHHook = custom_ssh_hook.CustomSSHHook
# ssh_hook.SSHHook.get_conn = custom_ssh_hook.CustomSSHHook.get_conn
print "completed monkey patching ssh hook get_conn"
误差
File "ssh_hook.py", line 5, in __init__
super(SSHHook, self).__init__()
RuntimeError: maximum recursion depth exceeded while calling a Python object
尝试添加自定义init
方法:
class CustomSSHHook(SSHHook):
def __init__(self):
super(SSHHook, self).__init__()
您可以通过向类中添加新变量来检测递归,对其进行自增并检查值。
*通常你不需要在python3
中为super
指定参数您可以将原始类(在monkey补丁之前)保存在一个变量中,并使用该变量代替super():
OriginalSSHHook = SSHHook
class CustomSSHHook(SSHHook):
def get_conn(self):
try:
print("custom ssh Hook")
return OriginalSSHHook.get_conn(self)
except Exception as e:
print("retry mechanism")
raise e