【问题标题】:instance has no __call__ method实例没有 __call__ 方法
【发布时间】:2014-03-08 18:36:14
【问题描述】:

我写了下面的代码作为练习,并用我的应用程序做一些向量代数。

from math import acos

class Vector:

    def __init__(self,x,y,z):
        self.x = x; self.y = y; self.z = z

    def __str__(self):
        return str(self.x) + "i + " + str(self.y) + "j + " + str(self.z) + "k"

    def magnitude(self):
        return self.x**2 + self.y**2 + self.z**2 

    def plus(self,Vector):
        return Vector(self.x+Vector.x,self.y+Vector.y,self.z+Vector.z)

    def minus(self,Vector):
        return Vector(self.x-Vector.x,self.y-Vector.y,self.z-Vector.z)

    def dot(self,Vector):
        return self.x*Vector.x,self.y*Vector.y,self.z*Vector.z

    def angle(self,Vector):
        return acos(self.dot(Vector)/(self.magnitude*Vector.magnitude))

    def cross(self,Vector):
        return Vector(self.x*Vector.z-self.z*Vector.y,self.z*Vector.x-self.x*Vector.z,self.x*Vector.y-self.y*Vector.x)

当我想创建两个实例(v1v2)并使用 v1.cross(v2) 时,我收到以下错误。

>>> v1.cross(v2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "vector_algebra.py", line 33, in cross
    return acos(self.dot(Vector)/(self.magnitude*Vector.magnitude))
AttributeError: Vector instance has no __call__ method

我做错了什么?如何为此类创建call 方法?

【问题讨论】:

  • 您的回溯与您发布的代码不匹配。发布的代码确实出现了错误。
  • 为了创建缩进,我将代码复制到其他地方,而不是复制到这里。

标签: python class object call


【解决方案1】:

在您的方法签名中:

def cross(self,Vector):  # and also the other methods

Vector 参数为 Vector 类名着色。您应该以不同的方式命名您的参数,例如小写的vector

【讨论】:

  • 或使用type(Vector),但重命名本地是更好的选择。
  • 是的,但是现在看到您的评论后,我想知道与代码的追溯关系
  • 我怀疑磁盘上的代码不再反映交互式解释器中加载的代码。字节码包含原始文件名和行号和偏移量,因此回溯重新读取源以显示匹配的源行。但是如果你同时更改了磁盘上的文件...
  • @zamk:在定义此类方法时,调用参数other 是一种相当普遍的做法。这清楚地表明该参数可以是另一个 Vector 或源自(或至少足够相似)要提供的参数。
  • @martineau:谢谢你的提示,我会考虑使用other
猜你喜欢
  • 2013-07-22
  • 1970-01-01
  • 2023-04-03
  • 2012-07-04
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多