簡體   English   中英

如何在Python中創建具有數組屬性的對象

[英]How to create objects with array-properties in Python

我正在尋找一種方法來在Python中將對象實現為具有不同屬性的數組。 我的想法是看起來像這樣的對象索引:

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

我敢肯定,我以前見過這個,但是我無法重新創建一個允許這樣做的類。 到目前為止,我最好的電話是(用偽代碼):

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

至少可以讓我為posxy屬性提供我想要的所有信息。 但是,我強烈希望第一個變體。 有人在面向對象編程方面有更多經驗可以幫助我嗎?

您想查看Python數據模型的“ 模擬容器類型”部分。

最起碼,你就必須實現__getitem__掛鈎 ,讓你的類手柄[...]索引。 這將僅傳遞第一 row值,無論此方法返回的內容如何,​​都將被索引為[col]

您可以選擇處理元組,也可以在self[row, col]上建立索引,然后將為key參數傳遞包含兩個值的元組:

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

要使用[]表示法,您需要覆蓋__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

您可以從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__ __getitem____setitem__ __contains__等。如果要手動實現,請參見Martijn的鏈接以獲取完整的方法列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM