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 回答