Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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_List_Object_Self - Fatal编程技术网

如何在Python中创建具有数组属性的对象

如何在Python中创建具有数组属性的对象,python,list,object,self,Python,List,Object,Self,我正在寻找一种在Python中将对象实现为具有不同属性的数组的方法。 我的想法是一个如下所示的对象索引: self[row][col].item1 = True self[row][col2].item2="xkcd" ... import collections class MyClass(collections.defaultdict): def __init__(self): collections.defaultdict.__init__(self, dict)

我正在寻找一种在Python中将对象实现为具有不同属性的数组的方法。 我的想法是一个如下所示的对象索引:

self[row][col].item1 = True
self[row][col2].item2="xkcd"
...
import collections

class MyClass(collections.defaultdict):
  def __init__(self):
    collections.defaultdict.__init__(self, dict)
    self[0][0] = True
    self[0][1] ="xkcd"
我很确定我以前见过这个,但是我不能重新创建一个允许这个的类。到目前为止,我最好的调用是(在伪代码中):


这至少允许我给属性posxy我想要的所有信息。然而,我更喜欢第一种变体。有更多面向对象编程经验的人能帮我吗?

要使用
[]
符号,您需要覆盖特殊方法。一个简单的例子:

class X:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data[index]
因此,要创建行和列,可以尝试以下操作:

class Row:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data[index]

class Matrix:
    def __init__(self, data):
        self.data = [Row(d) for d in data]

    def __getitem__(self, index):
        return self.data[index]
简单演示:

class X:
    def __init__(self, value):
        self.item1 = value

x = Matrix([[X('11'), X('12'), X('13')], [X('21'), X('22'), X('23')]])

print x[1][1].item1
给出:

>>>22

要使用
[]
符号,您需要重写特殊方法。一个简单的例子:

class X:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data[index]
因此,要创建行和列,可以尝试以下操作:

class Row:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data[index]

class Matrix:
    def __init__(self, data):
        self.data = [Row(d) for d in data]

    def __getitem__(self, index):
        return self.data[index]
简单演示:

class X:
    def __init__(self, value):
        self.item1 = value

x = Matrix([[X('11'), X('12'), X('13')], [X('21'), X('22'), X('23')]])

print x[1][1].item1
给出:

>>>22
您需要查看Python数据模型的部分

至少,您必须实现让类处理
[…]
索引。这将只传递第一个
值,此方法返回的任何值都将被索引为
[col]

您可以选择处理元组,在
self[row,col]
上建立索引,然后
key
参数将被传递一个包含两个值的元组:

def __getitem__(self, key):
    row, col = key  # unpack the tuple
    return self.matrix[row][col]
您需要查看Python数据模型的部分

至少,您必须实现让类处理
[…]
索引。这将只传递第一个
值,此方法返回的任何值都将被索引为
[col]

您可以选择处理元组,在
self[row,col]
上建立索引,然后
key
参数将被传递一个包含两个值的元组:

def __getitem__(self, key):
    row, col = key  # unpack the tuple
    return self.matrix[row][col]

您可以从defaultdict继承以下内容:

self[row][col].item1 = True
self[row][col2].item2="xkcd"
...
import collections

class MyClass(collections.defaultdict):
  def __init__(self):
    collections.defaultdict.__init__(self, dict)
    self[0][0] = True
    self[0][1] ="xkcd"
也就是说,每个顶级索引都会生成一个
dict
。如果你想要更结构化的东西,你的defaultdict需要一个不同的工厂函数。。。也许它会生成一个MyInnerClass,它也是一个defaultdict,包含您的最终类型


defaultdict为您所做的一切都是实现
\uuu getitem\uuuuuuuu
\uuuu setitem\uuuuuuuuu
\uu contains\uuuuuuuuuuuuuu
等。如果您想手动实现它,请参阅Martijn的链接以获取完整的方法列表。

您可以从defaultdict继承来获得如下内容:

self[row][col].item1 = True
self[row][col2].item2="xkcd"
...
import collections

class MyClass(collections.defaultdict):
  def __init__(self):
    collections.defaultdict.__init__(self, dict)
    self[0][0] = True
    self[0][1] ="xkcd"
也就是说,每个顶级索引都会生成一个
dict
。如果你想要更结构化的东西,你的defaultdict需要一个不同的工厂函数。。。也许它会生成一个MyInnerClass,它也是一个defaultdict,包含您的最终类型

defaultdict为您所做的一切就是实现
\uuu getitem\uuuuuuuuu
\uuuuu setitem\uuuuuuuuuu
\uu contains\uuuuuuuuuuuuuuuuuu
等。如果您想手动实现,请参阅Martijn的链接以获取完整的方法列表