Я пытаюсь создать класс, который наследует методы из списка Python, но также делает некоторые дополнительные вещи сверху ..., вероятно, проще просто показать код на данный момент ...Эмуляция метода list.insert() в качестве подкласса списка 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()
). Если я попытаюсь поддержать их всех, я завершаю рекурсивными циклами. Каков наилучший способ решения этой проблемы?
EDIT: Я принял предложение о подклассов 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)
'self = []' не делает то, что вы думаете. –
'super (HostList, self) .__ init __ (self)' будет делать трюк. Что делает ваш код, переназначить переменную (аргумент) 'self' на' [] '. –
'__getitem__' вернет объект списка, если указан срез. Вы можете изменить инициализатор на '__init __ (self, l = None)', который будет использовать список, если он предоставлен. Затем в '__getitem__', если ii - объект среза, тогда возвращаем' HostList (self._list [ii]) ' –