python - 模拟 list.insert() 方法作为 Python 列表的子类

标签 python list subclassing

我正在尝试构建一个从 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/

相关文章:

python - 匹配列表索引

class - Dart/Flutter 子类化以使用可选参数

c - win api - 如何为 TreeView 实现单独的事件过程

Python 神奇的 __getattr__() 的 PHP 方法

python - “ascii”编解码器无法解码 - 通过 pyodbc 将 CSV 转换为 SQL Server

python - 如何正确处理 C 中的文件读/写错误?

java - 如何处理父类(super class)构造函数中的所有子类成员?

python - 遍历元组并计算数字的百分比

java - Android Java 如何从列表中正确删除 int?

c# - 如何在 N 分钟后从通用列表中删除项目?