通过实例跟踪成员变量访问

时间:2016-02-29 16:57:02

标签: python python-2.7 python-3.x

我正在尝试编写一些跟踪成员变量访问的模块 通过实例。 1.是否有可能知道成员变量在运行时使用实例进行访问? 2.如果是,任何设计/指针或想法

目的:我想编写简单的脚本,它将读取实例访问的样本文件(模块)和成员变量。所以我们可以将其作为debuging框架的一部分来开发。

例如,如果我在main time.initial_time中写入,而不是我的脚本能够检测到时间实例已访问initial_time。它将在运行时运行。我的意思是,它将成为现有流程的一部分

真实目的 该对象包含1000个值,但每个模块使用其中一些值。如果它成为调试框架,那么我们可以通过实例轻松识别和打印成员变量访问的信息。是的每个模块都创建数据类的实例。 样本文件

"""testing pylint code"""
#!/usr/bin/env py
class Sample(object):
    """create sample class"""
    def __init__(self):
        """seting variable"""
        self.intial_time = 0

def main():
    """main functionality"""
    time = Sample()
    print time.initial_time

if __name__ == " __main__":
    main()

2 个答案:

答案 0 :(得分:1)

您可以使用描述符来完成。

属性是描述符的特例,但我相信在这种情况下它们不会对你有所帮助。

这是一个符合你想要的描述符:

from collections import defaultdict

class TrackedAttribute:

    def __init__(self, default_value):
        self.default = default_value
        # Dict mapping an instance to it's value
        self.instance_dict = defaultdict(lambda: default_value)

    def __get__(self, inst, owner):
        if inst is None:
            print("Accessed from class %r" % (owner,))
            return self.default
        print("Accessed from instance %r" % (inst,))
        return self.instance_dict[inst]

    def __set__(self, inst, value):
        print("Setting from instance %r" % (inst,))
        self.instance_dict[inst] = value


class Simple:
    time = TrackedAttribute(0)

答案 1 :(得分:0)

可能有更好的答案更适合您的特定需求(尝试识别未使用的变量),但Python有一个property装饰器,您可以使用:

class Sample(object):

    def __init__(self):
        self._initial_time = 0

    @property
    def initial_time(self):
        print('self.initial_time has been read')
        return self._initial_time

>>> print(Sample().initial_time)
self.initial_time has been read
0
>>>