我正在寻找一种方法来将对象实现为Python中具有不同属性的数组。 我的想法是一个像这样的对象索引:
self[row][col].item1 = True
self[row][col2].item2="xkcd"
...
我很确定我之前看过这个,但是我无法重新创建允许这样做的类。到目前为止,我最好的电话是(在虚拟代码中):
def __init__(self, posxy=[[...]*10]):
self.posxy=posxy
至少允许我给属性posxy我想要的所有信息。但是我非常喜欢第一种变体。有没有更多面向对象编程经验的人可以帮助我吗?
答案 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>