chiamate al metodo di registro per oggetto

2

Come registrare le chiamate di metodo su una base per oggetto per una particolare classe? Cioè dopo aver instancato a = myClass() in qualche modo voglio tenere un registro per quali metodi sono stati chiamati su a come

a.reverse()
a.loadNewData()
a.substract(somenparray)

più tardi voglio essere in grado di esaminare la cronologia / log di questo oggetto, ad es. %codice%. Tutto il materiale di registrazione che ho visto finora potrebbe essere utilizzato per registrare tutte le chiamate di funzioni, ma non limitato a una base per oggetto.

    
posta ragando 25.06.2015 - 10:24
fonte

1 risposta

1

Ecco un modo per farlo, che incrementa collections.Counter ogni è possibile accedere a un attributo callable :

class LoggingMixIn:

    def __init__(self, *args, **kwargs):
        self._log = Counter()
        super().__init__(*args, **kwargs)

    def __getattribute__(self, name):
        attr = super().__getattribute__(name)
        if callable(attr):
            self._log[name] += 1
        return attr

    def log(self):
        return self._log

In uso:

>>> from collections import Counter
>>> class Demo(LoggingMixIn):
        def method1(self):
            pass
        def method2(self):
            pass


>>> d = Demo()
>>> d.method1()
>>> d.method2()
>>> d.method2()
>>> d.log()
Counter({'method2': 2, 'method1': 1, 'log': 1})

Puoi indicare caso speciale name == 'log' se non desideri registrare le chiamate su log . Tuttavia, nota che non registra le chiamate all'istanza stessa o a una proprietà:

>>> class Demo(LoggingMixIn):
    def method(self):
        pass
    @property
    def property(self):
        pass
    def __call__(self):
        pass


>>> d = Demo()
>>> d.method()
>>> d.property
>>> d()
>>> d.log()
Counter({'log': 1, 'method': 1})
    
risposta data 25.06.2015 - 11:22
fonte

Leggi altre domande sui tag