如何在Python中使用array-properties创建对象

时间:2014-01-08 13:42:13

标签: python list object self

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

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

我很确定我之前看过这个,但是我无法重新创建允许这样做的类。到目前为止,我最好的电话是(在虚拟代码中):

def __init__(self, posxy=[[...]*10]):
    self.posxy=posxy

至少允许我给属性posxy我想要的所有信息。但是我非常喜欢第一种变体。有没有更多面向对象编程经验的人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

您想查看Python数据模型的Emulating container types部分。

至少,您必须实施__getitem__ hook才能让您的班级处理[...]索引。这只会传递第一个 row值,无论此方法返回什么,都会为[col]编制索引。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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,它也是一个默认的dict,包含你的最终类型。

所有defaultdict正在为您实施__getitem____setitem____contains__等。如果您想手动实施,请参阅Martijn的链接以获取完整的方法列表。< / p>