1

次のコードがあります。

class VectorN(object):
    def __init__(self, param):
        if isinstance(param, int):
            self.dim = param
            self.data = [0.0] * param

        elif isinstance(param, tuple):
            self.dim = 3
            self.data = param
        #else:
            #raise TypeError("You must pass an int or sequence!")

    def __str__(self):
        return "<Vector" + str(self.dim) + ": " + str(self.data) + ">"

    def __len__(self):
        return len(self.data)


    def __setitem__(self, key, item): 
        self.data[key] = item

__setitem__次のコードを使用してメソッドを呼び出そうとすると、

w = VectorN((1.2, "3", 5))
w.setitem(0, 9.9)
print(z) 
print(w) 
print(z[0])
print(len(v))

それは私に与えます:

AttributeError: 'VectorN' オブジェクトに属性 'setitem' がありません

4

1 に答える 1

1

それ__setitem__魔法のメソッドだからです。これは、コンテナ オブジェクトを作成できる特別な機能です。

これは魔法のメソッドなので、名前で直接呼び出す必要はありません。むしろ、Python 言語の組み込みの側面がその動作を制御します。これはまだ通常の方法であることに注意してください。名前で呼び出すこともできますが、構文はw.__setitem__(0, 9.9).

定義__setitem__することで、代わりに次のように値を設定できますw[0] = 9.9


__setitem__Python の魔法の方法へのガイド から:

表記法 self[nkey] = value を使用して、アイテムが割り当てられたときの動作を定義します。

于 2013-01-17T03:38:52.847 に答える