gpt4 book ai didi

python - 如何拦截实例方法调用?

转载 作者:太空狗 更新时间:2023-10-29 18:06:20 32 4
gpt4 key购买 nike

我正在寻找一种方法来拦截下面类 MyWrapper 中的实例方法调用:

class SomeClass1:
def a1(self):
self.internal_z()
return "a1"
def a2(self):
return "a2"
def internal_z(self):
return "z"

class SomeClass2(SomeClass1):
pass

class MyWrapper(SomeClass2):

# def INTERCEPT_ALL_FUNCTION_CALLS():
# result = Call_Original_Function()
# self.str += result
# return result


def __init__(self):
self.str = ''
def getFinalResult(self):
return self.str

x = MyWrapper()
x.a1()
x.a2()

我想拦截通过我的包装器类进行的所有函数调用。在我的包装器类中,我想跟踪所有结果字符串。

result = x.getFinalResult()
print result == 'a1a2'

最佳答案

一些快速而肮脏的代码:

class Wrapper:
def __init__(self, obj):
self.obj = obj
self.callable_results = []

def __getattr__(self, attr):
print("Getting {0}.{1}".format(type(self.obj).__name__, attr))
ret = getattr(self.obj, attr)
if hasattr(ret, "__call__"):
return self.FunctionWrapper(self, ret)
return ret

class FunctionWrapper:
def __init__(self, parent, callable):
self.parent = parent
self.callable = callable

def __call__(self, *args, **kwargs):
print("Calling {0}.{1}".format(
type(self.parent.obj).__name__, self.callable.__name__))
ret = self.callable(*args, **kwargs)
self.parent.callable_results.append(ret)
return ret

class A:
def __init__(self, val): self.val = val
def getval(self): return self.val

w = Wrapper(A(10))
print(w.val)
w.getval()
print(w.callable_results)

可能不够全面,但我想这可能是一个不错的起点。

关于python - 如何拦截实例方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4723717/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com