1

コンストラクターで作成されたenvという名前のネストされたリストと、次のように定義されたグリッドの要素を設定する別のメソッドがあります。

class Environment(object):
    def __init__(self,rowCount,columnCount):
        env = [[ None for i in range(columnCount)] for j in range(rowCount) ] 
        return env       

    def addElement(self, row, column):
        self[row][column] = 0

コードの後半で、次を実行して Environment のインスタンスを作成します。

myEnv = createEnvironment(6,6)

次に、次を実行して要素を環境に追加します。

myEnv.addElement(2,2)

したがって、グリッドの 2,2 の位置に 0 を持つ 6x6 グリッドとして新しい環境オブジェクトを受け取ることが予想されました。しかし、それはうまくいきませんでした。

2 つのエラーがあります。

  1. initメソッドから None 以外を返すことができません。
  2. 実行しようとしたときの主な問題addElement(2, 2)は、次のエラーが発生することです。

    "TypeError: 'Environment' object does not support indexing.

__getitem__メソッドとメソッドを調べました__setitem__が、多次元リストで機能させることができませんでした。グリッドを作成するために使用すべきより良いデータ構造はありますか?

4

1 に答える 1

5

ここでの問題は、オブジェクトを に置き換えることができないことです__init__。おそらく、サブクラスlist化して何かを行うことができますが__new__、それは非常にやり過ぎです。より良いオプションは、リストをラップすることです。

class Environment(object):
    def __init__(self, rows, columns):
        self.env = [[None for column in range(columns)] for row in range(rows) ] 

    def addElement(self, row, column):
        self.env[row][column] = 0

呼び出していると主張するのは少し奇妙であることに注意してくださいmyEnv = createEnvironment(6,6)-コンストラクターではなく関数を使用するのは少し奇妙です。

オブジェクトを本当にリストのように動作させたい場合は、もちろん__getitem__/のような追加のラッパー関数を大量に提供できます__setitem__。例えば:

def __getitem__(self, row, column):
    return self.env[row][column]

some_environment[5, 6]たとえば、これにより、次のことが可能になります。(システムと最適な機能に応じて、列を返すこともできます)。

于 2012-10-14T09:20:20.880 に答える