1

リストアイテムが認識される(属性/プロパティを持つ)リストの特定の特殊なケースが必要です。

  • アイテムがリストの最後のアイテムかどうか
  • リスト内のインデックスまたは「列挙子」

私が頭のてっぺんから考えることができるアプローチは次のとおりです。

  1. 、、、、__setitem__など__add__をオーバーライドします。アルinsertappendpop
  2. それらをpythonリストに保存するのではなく、次のアイテムを指す「次の」属性を持ちます。
  3. 評価前 (または更新後) にインデックス属性を同期するためのヘルパー関数の追加
  4. それらを属性として保存せず、クラスの「外部」で処理します

1) ほとんどの pythonic アプローチのように見えますが、かなりの数のメソッドをオーバーライドする必要があります。insert()2)上記のメソッドを再実装する必要があるという問題があります(また、必要に応じてインデックスを実際に使用することはできませんpop())3)&4)「Yを実行する前にXを呼び出すことを忘れないでください」という落とし穴があります

上記のリスト内のすべてのアイテムは、常に同じクラスのインスタンスになります (またはそうあるべきです)。

これまたは私が気付いていないpythonicアプローチの既知の設計パターンはありますか?

4

2 に答える 2

3

これは必要ないという点で、Marcinに同意します。しかし、なんらかの理由で、この機能が本当に本当に本当に必要な場合は、ここから始めるのが適切です。

class Node:
    def __init__(self, data):
        self.data = data
        self.index = 0
        self.next = None

class myContainer:
    def __init__(self, node):
        self.head = node
        self.length = 1
    def __setitem__(self, i, node):
        if i > self.length:
            raise ValueError("Index %s is too large. Cannot set item at that index. Current container length is %s" %(i, self.length))
        curr = self.head
        while i>0:
            curr = curr.next
            curr.next, node.next = node, curr.next
            node.index = curr.index + 1
        curr = node.next
        while curr is not None:
            curr.index += 1
            curr = curr.next
于 2013-09-10T19:31:37.670 に答える
2

リストアイテムが認識される(属性/プロパティを持つ)リストの特定の特殊なケースが必要です。アイテムがリストの最後のアイテムであるかどうか。[および]リスト内のインデックスまたは「列挙子」

いいえ、ありません。コードの他の部分で最後の要素を適切に処理するか、インデックスを操作する必要があります。

これらのことを追跡するのはリストオブジェクトの責任であるため、あなたが求めていることを行う明確な方法はありません。ほとんどの場合、リスト項目には親リストを保持するプロパティが必要ですが、それでもお勧めしません。

リストへの参照を保持するようにコードを書き直してください。

于 2013-09-10T19:28:13.370 に答える