Я пытаюсь создать класс, который наследует методы из списка 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)