Python捕获方法调用和参数

2024-09-29 17:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在不重写方法的情况下从单例类捕获函数调用。在

目前我正在做这个:

class MyClass
    oldMethod = None

    def __init__(self):
        c = Class.Instance()
        self.oldMethod = c.Method #make a copy to the pointer of the original function
        c.Method = self.NewMethod #redirect it

    def NewMethod(self, x, a):
        self.oldMethod(x, a) #call the old function
        #My Stuff

我试图捕获“event”(作为方法调用)和此方法调用的参数。有没有其他方法可以说“被动地”捕捉它,只需聆听并获取参数。在

注意:我没有访问singleton类的代码。在

谢谢


Tags: the方法selfnone参数defmyclass情况
2条回答

您提到要在正常操作期间拦截方法调用,而不仅仅是在调试期间。这个解决方案与另一种方法不同,它使用Proxy pattern方法来生成一个新对象,该对象将作为对原始对象的所有调用的包装器。在代理级别,您可以根据需要记录和监视调用。在

人.py

为了演示代码,我在person模块中创建了一个名为Person的示例类。我们可以假设这是你不能修改代码的模块。在

class Person(object):
    def __init__(self, name=None):
        self.name = name

    def greet(self, greeting='hello'):
        print '%s %s' % (greeting, self.name)

    def __repr__(self):
        return "Person(%r)" % self.name

示例.py

在下面的代码中,我们创建了一个名为ProxyPerson的代理对象,当使用它而不是{}时,它的行为与它相同,并且添加了记录对greet方法的所有调用的行为。您注意到它使用了*args, **kwargs,因此Person将来可能会有不同的签名,但是如果进行了更改,代码不会中断。在

^{pr2}$

常规输出

下面的输出显示了使用原始Person类或使用ProxyPerson时的执行差异。这些示例还包括没有位置参数的调用、带有位置参数的调用,最后还有关键字参数的调用。在

hello Jack
hi Jack
why hello Jack
 - greet() self=Person('Jill') args=() kwargs={}
hello Jill
 - greet() self=Person('Jill') args=('hi',) kwargs={}
hi Jill
 - greet() self=Person('Jill') args=() kwargs={'greeting': 'why hello'}
why hello Jill

猴子补丁输出

最后,可以Monkey patchperson.Person类指向ProxyPerson。您可以通过注释掉example.py中的monkey patch行来试验这种方法。这种情况下的输出如下:

 - greet() self=Person('Jack') args=() kwargs={}
hello Jack
 - greet() self=Person('Jack') args=('hi',) kwargs={}
hi Jack
 - greet() self=Person('Jack') args=() kwargs={'greeting': 'why hello'}
why hello Jack
 - greet() self=Person('Jill') args=() kwargs={}
hello Jill
 - greet() self=Person('Jill') args=('hi',) kwargs={}
hi Jill
 - greet() self=Person('Jill') args=() kwargs={'greeting': 'why hello'}
why hello Jill

猴子修补的好处是人。人实际上是已创建的代理对象的实例。Monkey-patching自带一系列问题,您在使用它之前应该记住这些问题。在

您可以使用winpdb这是一个非常容易使用的python图形调试器。所以您只需打开有问题的python脚本,在您想查看的任何类中的任何方法处设置一个breakpoint。它将在这一点上暂停,并向您显示变量的状态以及每次调用该方法时不显示的内容。在

相关问题 更多 >

    热门问题