捕获和打印对象成员的访问

时间:2014-12-01 14:35:55

标签: python python-3.x

我们假设我有一个典型核心的模型,其中包含32位GPR(在下面的示例中用R表示),而后者又是Bitstring类型的对象,它提供了实现自定义切片方法的方法。

class core:
    def __init__(self):
        self.R = [Bitstring(0x0, 32) for reg in range(32)]
        ...
        ...

我可能会访问这些寄存器,这些寄存器分为两类:

Cat a) - >单次访问完整或部分注册:

Eg:core.R[10] = 0x1000 OR core.R[11][0:3] = 0x8

Cat b): - >多个语句分配同一寄存器的不同部分:

Eg:core.R[0][0:7] = core.R[10][28:31]
   core.R[0][8:15] = 0x10

每当在上述任何一个类别中访问某个寄存器时,我都希望使用以下格式记录打印:

R r<num> <value> 
Eg:R r10 0xaabbccdd

其中<num>0, 31范围内的寄存器编号,<value>是分配给该寄存器的值。

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您需要这个来快速调试代码,您可以暂时将Bitstring对象包装在与相关行为挂钩的代理中。代理可能看起来像:

class Proxy(object):
    def __init__(self, proxied, outerindex):
        self.proxied = proxied
        self.outerindex = outerindex
    def __getitem__(self, index):
        logger.debug("Observing access of %r at %r:%r", (self.proxied, self.outerindex, index))
        return self.proxied[index]
    # __setitem__ similarly

在施工时,您需要将i Bitstring b包裹在proxy(b, i)中以访问记录器中的两个索引。这假设您在除Bitstring之外的其他方法上不使用任何方法(或者您也必须将它们添加到代理中)。间接有一些成本并且有点难看,所以如果你想保留这个功能,你可能最好通过实现访问器方法并只登录core的子类。