2016-02-29 61 views
0

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

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

例如,如果我在主time.initial_time中编写比我的脚本能够检测到initial_time已被time Instance访问的脚本。它将在运行时运行。我的意思是,这将是现有流程的一部分

真正目的 对象包含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() 

回答

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 
>>> 
0

你可以用描述符来做。

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

这里是一个描述符,它不正是你想要什么:

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)