Sto cercando di costruire una classe che eredita i metodi dalla lista di Python, ma fa anche alcune cose aggiuntive in cima ... è probabilmente più facile solo per mostrare il codice a questo punto ...Emulando il metodo list.insert() come una sottoclasse di lista di 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
mio problema è questo ... se voglio eseguire lo stesso tipo di prove di ammissione degli oggetti su insert()
come ho fatto su append()
, non riesco a trovare un modo per codificare il nuovi metodi senza sacrificare il supporto per un metodo di espansione di un elenco (ad esempio list.append()
, list.insert()
o list.extend()
). Se provo a supportarli tutti, finisco con loop ricorsivi. Qual è il modo migliore per risolvere questo problema?
EDIT: ho preso il suggerimento su sottoclassi collections.MutableSequence al posto della lista di Python()
Il codice risultante ... distacco qui nel caso in cui, aiuta qualcuno ...
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 = []' non fa quello che pensi che faccia. –
'super (HostList, self) .__ init __ (self)' farebbe il trucco. Quello che fa il tuo codice è riassegnare la variabile (argomento) 'self' a' [] '. –
'__getitem__' restituirà un oggetto lista se viene specificata una porzione. È possibile modificare l'inizializzatore in '__init __ (self, l = None)' che utilizzerà un elenco se fornito. Quindi in '__getitem__', se ii è un oggetto fetta, quindi restituisci' HostList (self._list [ii]) ' –