如何在Python中创建具有数组属性的对象
我正在寻找一种在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)
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的链接以获取完整的方法列表