2016-02-29 2 views
0

Я пытаюсь написать некоторый модуль, который отслеживает доступ к переменной-члену через экземпляр. 1. возможно ли знать, что переменная-член имеет доступ, используя экземпляр во время выполнения? 2. если да, любая конструкция/указатель или идеяотслеживать доступ переменной элемента через экземпляр

Назначение: Я хотел бы написать простой скрипт, который будет читать пример файла (модуля) и переменную-члена, к которой обращается экземпляр. Поэтому мы можем разработать это как часть структуры отладки.

Например, если я пишу в основное время.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() 

ответ

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) 
Смежные вопросы