Subclass Python list to Validate New Items

后端 未结 6 1438
广开言路
广开言路 2021-01-13 14:46

I want a python list which represents itself externally as an average of its internal list items, but otherwise behaves as a list. It should raise a TypeError i

6条回答
  •  耶瑟儿~
    2021-01-13 15:18

    Here's how to create a subclass using the MutableSequence abstract base class in the collections module as its base class (not fully tested -- an exercise for the reader ;-):

    import collections
    
    class AveragedSequence(collections.MutableSequence):
        def _validate(self, x):
            try: return float(x)
            except: raise TypeError("Can't add {} to AveragedSequence".format(x))
        def average(self):  return sum(self._list) / len(self._list)
        def __init__(self, arg):  self._list = [self._validate(v) for v in arg]
        def __repr__(self):  return 'AveragedSequence({!r})'.format(self._list)
        def __setitem__(self, i, value):  self._list[i] = self._validate(value)
        def __delitem__(self, i):  del self._list[i]
        def insert(i, value):  return self._list.insert(i, self._validate(value))
        def __getitem__(self, i):  return self._list[i]
        def __len__(self):  return len(self._list)
        def __iter__(self):  return iter(self._list)
        def __contains__(self, item):  return item in self._list
    
    if __name__ == '__main__':
        avgseq = AveragedSequence(range(10))
        print avgseq
        print avgseq.average()
        avgseq[2] = 3
        print avgseq
        print avgseq.average()
        # ..etc
    

提交回复
热议问题