你好,我在学习python,我得到了课程主题。 我收到这样一条错误消息:
"TypeError: __init__() missing 1 required positional argument: 'y'"
这是我在shell中的代码:
class Vektor():
""" Bu bir vektör sınıfıdır"""
def __init__(self,x,y):
self.x = x
self.y = y
def boyu(self):
boy = (self.x**2+self.y**2)**0.5
return boy
def __repr__(self):
return ("%di + %dy" %(self.x, self.y))
def __sub__(self,digeri):
return Vektor(self.x - digeri.x, self.y - digeri.y)
def __add__(self,digeri):
return Vektor(self.x + digeri.x, self.y + digeri.y)
def __eq__(self,digeri):
if self.boyu() == digeri.boyu(): return True
def __mul__(self,digeri):
self.x = Vektor(self.x + digeri.x)
self.y = Vektor(self.y + digeri.y)
return Vektor(self.x*digeri.x,self.y*digeri.y)
当我试图像这样创建一个C=a*B时,我得到了一个错误:
TypeError:init()缺少1个必需的位置参数:“y”
我已经谢谢你了,我想提醒我编程新手:))
在
__mul__
中,您这样做是出于某种原因:它调用}提供任何值,因此出现错误。
另外,这还试图将属性
Vektor.__init__
,只提供位置参数x
,值为self.x + digeri.x
,但没有为{x
从Vektor
本身更改为一个对象,我无法想象这是您想要的。在对我来说,不清楚您的
return
语句前面的两行应该做什么。同时这两条线都会产生你看到的错误。在你的
^{pr2}$__mul__
应该是点积吗?如果是,请尝试:类的另一个简化是允许在坐标上进行迭代,例如:
^{3}$那么你的点积可能看起来像:
有一个VecPy,这是一个非常简单的示例类,它可以做这种事情。也许看看能给你更多的想法。在
错误是由于
当我们像您编写语法的方式调用Vector时,它认为您想要初始化它,它需要两个输入。只要去掉前两行mul函数就可以解决这个问题。在
Vektor.__init__
需要多少个参数?忽略self
,它是两个-x
和{当您编写
return Vektor(self.x*digeri.x,self.y*digeri.y)
时,您传递了两个参数,因此这是可行的。在当您编写
self.x = Vektor(self.x + digeri.x)
时,这不起作用,因为您没有为y
值传递第二个参数。在当Python给出错误时,它应该包含一个行号,它应该显示错误发生的位置。你没有写,但这是这行,不是吗?在
由于
Vektor
应该包含两个标量,并且有时不会用两个向量替换它们,所以您可以只编写但更重要的一课是仔细阅读错误消息。你需要的一切都在那里。在
关于操作符语义的一点注记:由于您通常不会期望像
x = v * w
这样的表达式来修改x
,所以无论如何也不应该在操作符函数内对self
进行变异。在返回结果向量,这就足够了。我向您展示了如何修复这两行的语法,但您实际上应该完全删除它们。在
关于向量的另一个注意事项是:重载
*
并不像标量数值类型那样明显获胜,因为向量通常有不止一种可能的乘积类型。在相关问题 更多 >
编程相关推荐