Track changes to lists and dictionaries in python?

后端 未结 5 1202
别跟我提以往
别跟我提以往 2020-12-14 03:04

I have a class where the instances of this class needs to track the changes to its attributes.

Example: obj.att = 2 would be something that\'s easily tr

5条回答
  •  执笔经年
    2020-12-14 03:53

    You could take advantage of the abstract base classes in the collections module, which dict and list implement. This gives you a standard library interface to code against with a short list of methods to override, __getitem__, __setitem__, __delitem__, insert. Wrap the attributes in a trackable adapter inside __getattribute__.

    import collections
    
    class Trackable(object):
        def __getattribute__(self, name):
            attr = object.__getattribute__(self, name)
            if isinstance(attr, collections.MutableSequence):
                attr = TrackableSequence(self, attr)
            if isinstance(attr, collections.MutableMapping):
                attr = TrackableMapping(self, attr)
            return attr
    
        def __setattr__(self, name, value):
            object.__setattr__(self, name, value)
            # add change tracking
    
    
    class TrackableSequence(collections.MutableSequence):
        def __init__(self, tracker, trackee):
            self.tracker = tracker
            self.trackee = trackee
    
        # override all MutableSequence's abstract methods
        # override the the mutator abstract methods to include change tracking
    
    
    class TrackableMapping(collections.MutableMapping):
        def __init__(self, tracker, trackee):
            self.tracker = tracker
            self.trackee = trackee
    
        # override all MutableMapping's abstract methods
        # override the the mutator abstract methods to include change tracking
    

提交回复
热议问题