2014-01-08 83 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的鏈接以獲取完整的方法列表。

相關問題