你好,我正在学习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”
我已经谢谢你了,我想提醒我编程中的一个新话题:))
答案 0 :(得分:2)
Vektor.__init__
需要多少个参数?忽略self
,它是两个-x
和y
。
写return Vektor(self.x*digeri.x,self.y*digeri.y)
时,您传递了两个参数,因此可行。
编写self.x = Vektor(self.x + digeri.x)
时,此操作不起作用,因为您没有为y
值传递第二个参数。
当Python给您错误时,它应该包含一个行号,该行号应显示错误发生的位置。您没有包括在内,但这是这一行,不是吗?
由于Vektor
应该包含两个标量,并且有时不用两个向量替换它们,因此您可以编写
self.x = self.x + digeri.x # still not a vector
self.y = self.y + digeri.y # also not a vector
,但是更重要的一课是仔细阅读错误消息。您需要的一切都在那里。
关于运算符语义的注释:由于通常不会期望像x = v * w
这样的表达式来修改x
,因此无论如何您都不应该在运算符函数中对self
进行突变。 / p>
您返回结果向量,就足够了。我向您展示了如何修复这两行的语法,但您实际上应该完全删除它们。
关于向量的另一条注释:*
的重载并不是明显的胜利,因为对于标量数值类型而言,重载并不明显,因为向量通常具有不止一种可能的乘积类型。
答案 1 :(得分:1)
在__mul__
中,您由于某些原因而这样做:
self.x = Vektor(self.x + digeri.x)
正在调用Vektor.__init__
,它仅提供位置自变量x
,其值为self.x + digeri.x
,而y
则不提供任何值,因此出错。
同样,这试图将属性x
从Vektor
本身变成一个对象,我无法想象这正是您想要的。
对我来说,尚不清楚return
中__mul__
语句前的两行应该做什么。而且这两行都会产生您看到的错误。
您的__mul__
应该是点积吗?如果是这样,请尝试:
return self.x*digeri.x + self.y*digeri.y
对类的另一个简化可能是允许对坐标进行迭代,例如:
@property
def coords(self):
return self.x, self.y
def __iter__(self):
return self.coords.__iter__()
然后您的点积可能看起来像:
def dot(self, w):
"""
The dot product of self and other vector w.
"""
return sum([xi_s * xi_w for xi_s, xi_w in zip(self, w)])
有VecPy,这是一个非常简单的示例类,可以执行此类操作。也许看看可以给您更多的想法。
答案 2 :(得分:0)
该错误是由于
self.x = Vektor(self.x + digeri.x)
当我们像编写语法的方式那样调用Vector时,它认为您想对其进行初始化,并且期望有两个输入。只需摆脱mul函数的前两行即可解决此问题。