我正在尝试构建一个从 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()
).如果我试图支持所有这些,我最终会遇到递归循环。解决此问题的最佳方法是什么?
编辑:我采纳了关于子类化集合的建议。MutableSequence 而不是 Python 的 list()
生成的代码...张贴在这里以防万一,它可以帮助某人...
from collections.abc 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):
# Good MutableSequence() implementation example in the cpython git repo:
# https://github.com/python/cpython/blob/208a7e957b812ad3b3733791845447677a704f3e/Lib/collections/__init__.py#L1215
if isinstance(ii, slice):
return self.__class__(self._list[ii])
else:
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)
最佳答案
如果可以避免,请不要继承内置类。 (你可以,但这并不意味着你应该没有真正令人信服的理由)
这些类针对速度进行了优化,这使得从它们正确继承非常乏味,因为您最终不得不覆盖几乎所有内容。
继承自 collections.MutableSequence
相反,您可以仅实现几个基本方法,并获得序列 API 的强大且功能齐全的实现,而没有继承自 的所有怪癖和警告>列表
。
关于python - 模拟 list.insert() 方法作为 Python 列表的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5586533/