Эмуляция метода list.insert () как подкласса списка Python

Я пытаюсь создать класс, который наследует методы из списка Python, но также делает некоторые дополнительные вещи поверх ... вероятно, проще просто показать код на этом этапе ...

class Host(object):
    """Emulate a virtual host attached to a physical interface"""
    def __init__(self):
    # Insert class properties here...
    pass

class HostList(list):
    """A container for managing lists of hosts"""
    def __init__(self):
        self = []

    def append(self, hostobj): 
        """append to the list...""" 
        if hostobj.__class__.__name__ == 'Host': 
            self.insert(len(self), hostobj)
        else:
            _classname = hostobj.__class__.__name__
            raise RuntimeError, "Cannot append a '%s' object to a HostList" % _classname

Моя проблема в том ... если я хочу выполнить такие же тесты допуска объекта на insert () , как я сделал на append () , я не могу найти способ кодирования новых методов без ущерба для поддержки одного метода расширения списка (например, list.append ( ) , list.insert () или list.extend () ). Если я пытаюсь поддержать их всех, я получаю рекурсивные петли. Как лучше всего решить эту проблему?

РЕДАКТИРОВАТЬ: Я принял предложение о создании подклассов collections.MutableSequence вместо списка Python ()

Получившийся код ... размещение здесь в случае, если он кому-то поможет ...

from collections import MutableSequence
class HostList(MutableSequence):
    """A container for manipulating lists of hosts"""
    def __init__(self, data):
        super(HostList, self).__init__()
        if (data is not None):
            self._list = list(data)
        else:
            self._list = list()

    def __repr__(self):
        return "<{0} {1}>".format(self.__class__.__name__, self._list)

    def __len__(self):
        """List length"""
        return len(self._list)

    def __getitem__(self, ii):
        """Get a list item"""
        return self._list[ii]

    def __delitem__(self, ii):
        """Delete an item"""
        del self._list[ii]

    def __setitem__(self, ii, val):
        # optional: self._acl_check(val)
        return self._list[ii]
    def __str__(self):
        return str(self._list)
    def insert(self, ii, val):
        # optional: self._acl_check(val)
        self._list.insert(ii, val)
    def append(self, val):
        self.insert(len(self._list), val)
6
задан Mike Pennington 19 January 2017 в 21:40
поделиться