Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更新类中的对象值_Python_Class_Object_Return - Fatal编程技术网

Python 更新类中的对象值

Python 更新类中的对象值,python,class,object,return,Python,Class,Object,Return,我有一个问题,关于如何在一个类中返回一个对象的更新值,然后在同一个类中的另一个函数中使用它。这是我的旧代码 class Vector: def __init__(self, a): self.a = a assert type(self.a) == list for i in self.a: assert type(i) == int or type(i) == float def dim(self): return len(self.a) def

我有一个问题,关于如何在一个类中返回一个对象的更新值,然后在同一个类中的另一个函数中使用它。这是我的旧代码

class Vector:
def __init__(self, a):
    self.a = a
    assert type(self.a) == list
    for i in self.a:
        assert type(i) == int or type(i) == float
def dim(self):
    return len(self.a)
def __getitem__(self, i):
    assert i >= 1 and i <= self.dim()
    return self.a[i-1]
def __setitem__(self, i, x):
    assert i >= 1 and i <= self.dim()
    self.a[i-1] = x
    return self.a[i-1]
def __str__(self):
    return 'Vector: ' + str(self.a)
def __add__(self, other):
    assert type(other.a) == list and other.dim() == self.dim()
    n = []
    for j in range(self.dim()):
        n.append(self.a[j]+other.a[j])
    self.a = n 
    return self.a
我的输出是
'[3,5,7]'
,这意味着它只在
返回self.a
之后,而不是
\uuuu str\uuuuu
函数,但是我希望我的输出是
'Vector:[3,5,7]
,因为它应该在
\uu str uuuu
函数之后。我通过在
\uuuu add\uuuu
函数中返回
向量(self.a)
解决了这个问题,但我不知道为什么会这样。有人能解释为什么这样做,以及为什么
返回self.a
不只是更新对象值并运行
\uu str\uu
函数吗

注意:Python使用以下等效符号:

v[i]       ==  v.__getitem__(i)
v[i] = x   ==  v.__setitem__(i, x)
str(v)     ==  v.__str__()
v + other  ==  v.__add__(other)

是的,因为你的
\uuuuu add\uuuu
返回
self.a
,这是一个列表
self
是一个
Vector
self。a
是一个列表。返回类似于
Vector(self.a)
的内容。但老实说,你真的想让
+
在原地工作吗?这在Python中并不常见,这就是您所做的。。。但是,既然您已经这样做了,您可以只返回
self
。而且
\uuuuu setitem\uuuuuu
可能不应该返回任何内容。谢谢juanpa.arrivillaga!我现在明白了返回列表的问题。但是我还是不太明白你说的让
+
工作是什么意思。是的,关于
\uuuuuu setitem\uuuuuuuuuuuuu
你是对的,我删除了返回值。我的意思是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu添加
修改你的一个对象,而它应该返回一个新对象。考虑已经使用“<代码> +>代码>运算符的列表工作方式:<代码> a= [1,2];b=[3,5]然后尝试打印(a+b),您将看到
[1,2,3,4]
,但是
a
b
不会改变!在您的实现中,
a
将改变!所以只需删除self.a=n这一行,然后只需
返回向量(n)
v[i]       ==  v.__getitem__(i)
v[i] = x   ==  v.__setitem__(i, x)
str(v)     ==  v.__str__()
v + other  ==  v.__add__(other)