2014-01-08 53 views
0

我正在寻找一种将对象作为具有Python中不同属性的数组实现的方法。 我的想法是一个对象指数看起来像这样:如何在Python中使用数组属性创建对象

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

我敢肯定,我以前看到这一点,但我无法重新创建一个类,允许这一点。我最美好的呼唤,到目前为止(在伪代码):

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

它至少可以让我给属性posxy我想所有信息。不过,我强烈希望第一个变体。有人可以有更多的面向对象编程经验,请帮助我吗?

回答

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

你想看看Python数据模型的3210部分。

至少,您必须实施__getitem__ hook才能让您的课程处理[...]索引。这只会通过的第一个row的值,无论这种方法返回将索引为[col]

您可以选择处理的元组代替,索引上self[row, col]也是如此,key参数将被传递两个值,而不是一个元组:

def __getitem__(self, key): 
    row, col = key # unpack the tuple 
    return self.matrix[row][col] 
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,它也是一个defaultdict,包含你的最终类型。

所有defaultdict正在为您做的是实施__getitem__,__setitem__,__contains__等。如果您想手动实施它,请参阅Martijn的链接以获取完整的方法列表。

相关问题