मैं एक वर्ग है कि अजगर की सूची से तरीकों विरासत का निर्माण करने की कोशिश कर रहा हूँ, लेकिन यह भी शीर्ष पर कुछ अतिरिक्त काम करता है ... यह शायद आसान बस कोड को दिखाने के लिए है इस बिंदु पर ...अजगर की सूची का एक उपवर्ग के रूप में list.insert() विधि नकल
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
मेरे समस्या यह है ... अगर मैं के रूप में मैं append()
पर किया था insert()
पर वस्तु प्रवेश परीक्षा का एक ही तरह का प्रदर्शन करना चाहते हैं, मैं कोड करने के लिए एक तरह से नहीं मिल सकता है एक सूची में विस्तार विधि के लिए समर्थन का त्याग करने के लिए बिना नए तरीकों (यानी list.append()
, list.insert()
, या list.extend()
)। अगर मैं उन सभी का समर्थन करने की कोशिश करता हूं, तो मैं रिकर्सिव लूप के साथ उड़ जाता हूं। इस समस्या के आसपास सबसे अच्छा तरीका क्या है?
संपादित करें: मैं अजगर की सूची()
जिसके परिणामस्वरूप कोड ... यहाँ मामले में पोस्टिंग, यह किसी को मदद करता है के बजाय collections.MutableSequence उपवर्गीकरण के बारे में सुझाव ले लिया ...
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)
'स्वयं = []' आप क्या सोचते हैं यह करता है नहीं करता है। –
'सुपर (होस्टलिस्ट, स्वयं) .__ init __ (स्वयं) 'चाल करेगा। आपका कोड क्या करता है (तर्क) चर 'self'' '[]' को फिर से सौंपता है। –
'__getitem__' एक स्लाइस निर्दिष्ट होने पर एक सूची ऑब्जेक्ट वापस कर देगा। आप प्रारंभकर्ता को '__init __ (स्वयं, एल = कोई नहीं) 'में बदल सकते हैं जो प्रदान की गई सूची का उपयोग करेगा। फिर '__getitem__' में, अगर ii एक टुकड़ा वस्तु है, तो वापस जाने के' HostList (self._list [ii]) ' –