Python 如何创建一个同时也是列表的类?

Python 如何创建一个同时也是列表的类?,python,Python,我想在Python中创建一个具有各种属性和方法的类,但要让它继承列表的功能,这样我就可以将对象附加到对象本身,而不是它的任何属性。我希望能够说“graph[3]”,而不是“graph.node\u list[3]”。有办法做到这一点吗?您真正需要做的就是提供 附录:您可能还想提供其他方法\uu len\uu绝对是其中之一。这里有一个相当长的魔术方法列表,我建议你仔细研究一下,然后选择那些有意义的方法 您希望添加一些特殊的方法,例如列表中的\uuu getitem\uuu。看看: 您可以从列表继承

我想在Python中创建一个具有各种属性和方法的类,但要让它继承列表的功能,这样我就可以将对象附加到对象本身,而不是它的任何属性。我希望能够说“
graph[3]
”,而不是“
graph.node\u list[3]
”。有办法做到这一点吗?

您真正需要做的就是提供


附录:您可能还想提供其他方法
\uu len\uu
绝对是其中之一。这里有一个相当长的魔术方法列表,我建议你仔细研究一下,然后选择那些有意义的方法

您希望添加一些特殊的方法,例如列表中的
\uuu getitem\uuu
。看看:


您可以从
列表继承:

class Foo(list):
    def __init__(self):
        pass
但是子类化内置类型并不一定是个好主意


collections.abc.Sequence
(或者从3.5开始,
typing.Sequence[T]
)是我的工作方式。

由于Python使用,列表和任何其他对象之间的主要区别是它公开的一组方法。您可以通过函数轻松查看对象的主要属性(方法和字段)

>>> [a for a in dir([]) if callable(getattr([], a))]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__',
'__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
显然这里有很多方法,你可能不在乎其中的大多数。但是,如果您的目标是真正复制列表的行为,那么您可能希望实现它们。如果您想查找的话,大多数
\uuu…\ uuuu
方法都是在Python中定义的

从该页:

可变序列应该提供方法
append()
count()
index()
extend()
insert()
pop()
remove()
reverse()
排序()
,就像Python标准列表对象一样。最后,序列类型应该通过定义下面描述的方法来实现加法(意思是连接)和乘法(意思是重复);它们不应定义其他数值运算符。建议映射和序列都实现
\uuuuu contains\uuuu()
方法,以便有效地使用in运算符;对于映射,应在中搜索映射的键;对于序列,它应该搜索所有值。进一步建议映射和序列实现
\uuu iter\uuu()
方法,以允许通过容器进行有效迭代;对于映射,
\uuuuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;对于序列,它应该遍历这些值


您特别询问的功能,索引查找,由提供。我建议至少实现
\uuuu contains\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。或者至少实现
\uu len\uu
..@kirbyfan64sos,由于虚拟子类化,您不需要从任何
集合
abc
继承,除非您想继承它们的方法。@Navith我指的是像Mypy这样的类型检查器。:)这不一定是个好主意。-你指的是第一种方法还是第二种方法?还有,为什么这不是一个好主意?@alfasin将内置类型子类化通常不是一个好主意。
>>> [a for a in dir([]) if callable(getattr([], a))]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__',
'__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']