Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个类似Python数组的对象,它可以像数组一样使用?_Python_Python 3.x - Fatal编程技术网

如何创建一个类似Python数组的对象,它可以像数组一样使用?

如何创建一个类似Python数组的对象,它可以像数组一样使用?,python,python-3.x,Python,Python 3.x,如何创建一个类型,其实例可以用[]索引,就像列表一样 我可以像这样使用这个物体 my_obj[***] 我想你是在问如何创建一个序列类型——一种可以用[]索引其实例的类型,就像列表一样 这样做的关键是实现一个或多个特殊方法,如文档中所述 特别是,为my_obj[1]调用的特殊方法是 举个非常简单的例子,让我们创建一个类似于所有小写英文字母的列表: class Letters: def __getitem__(self, index): return string.asc

如何创建一个类型,其实例可以用[]索引,就像列表一样

我可以像这样使用这个物体

my_obj[***]


我想你是在问如何创建一个序列类型——一种可以用
[]
索引其实例的类型,就像列表一样


这样做的关键是实现一个或多个特殊方法,如文档中所述

特别是,为
my_obj[1]
调用的特殊方法是

举个非常简单的例子,让我们创建一个类似于所有小写英文字母的列表:

class Letters:
    def __getitem__(self, index):
        return string.ascii_lowercase[index]
现在:

>>> letters = Letters()
>>> letters[2]
'c'
>>> letters[-2]
'y'
>>> letters[3:6]
'def'
然而,这并不是一个完整的序列。例如:

>>> len(letters)
TypeError: object of type 'Letters' has no len()
>>> reversed(letters)
TypeError: object of type 'Letters' has no len()
>>> isinstance(letters, collections.abc.Sequence)
False

如果您想要实现一个完整的序列,那么该模块非常有用,因为它提供的所有抽象基类都是mixin类,它们为您填充了大部分实现。例如,如果我们继承了
序列
,我们就可以定义
\uuuu getitem\uuuuuu
\uuu len\uuuuu
,它将免费为我们提供
\uu contains\uuuuuuu
\uu reversed\uuuuu
索引和
计数的实现:

class Letters(collections.abc.Sequence):
    def __getitem__(self, index):
        return string.ascii_lowercase[index]
    def __len__(self):
        return 26
现在,在
列表
元组
范围
上工作的所有内容都在
字母
上工作:

>>> letters = Letters()
>>> len(letters)
26
>>> reversed(letters)
<generator object Sequence.__reversed__ at 0x15f949f68>
>>> print(*reversed(letters))
z y x w v u t s r q p o n m l k j i h g f e d c b a
>>> letters.index('s')
10
>>> isinstance(letters, collections.abc.Sequence)
True
(您经常希望切片返回另一个
类型(self)
的实例,而不是列表,但对于
字母
,这没有任何意义,因此我只返回了一个列表。)


如果您想要一个可变序列,比如列表而不是元组,您可以在其中修改值,或者添加和删除值,那么还有一些方法可以实现,但没有什么大的不同



有关更完整的示例,请参见。

当您说“array like”时,您是在说NumPy术语“array like”,还是在问如何编写一个列表,或者您是在问如何定义自己的类,其行为类似于序列?很抱歉我的英语表达不好。我称之为“Array like”实际上是指一种类型,其实例可以用[]索引,就像一个列表一样。(从第一个答案复制!这正是我想要的!!!非常感谢!
def __getitem__(self, index):
    if isinstance(index, slice):
        return [self[i] for i in index.indices(len(self))]
    if index < 0:
        index += len(self)
    return string.ascii_lowercase[index]