【问题标题】:'int' object has no attribute 'x'“int”对象没有属性“x”
【发布时间】:2016-11-10 15:04:34
【问题描述】:

我正在尝试制作一个程序来使用__add __添加向量:

class vects:
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def __add__(self, vect):
        total_x = self.x + vect.x
        total_y = self.y + vect.y
        return vects(total_x, total_y)

plusv1 = vects.__add__(2,5)
plusv2 = vects.__add__(1,7)
totalplus = plusv1 + plusv2

产生的错误如下:

line 12, in <module> plusv1 = vects.__add__(2,5)
line 7, in __add__ total_x = self.x + vect.x
AttributeError: 'int' object has no attribute 'x' 

【问题讨论】:

  • 根据我对您的代码的理解,您正在使用的函数应按如下方式使用:vects.__add__(vects(2, 5)) 而不是 vects.__add__(2, 5),因为 add 定义正在等待只有 1 个参数,这似乎是 vects 类的另一个实例

标签: python class python-3.x


【解决方案1】:

你不要那样使用__add__! :-) 当+ 用于Vects 类的实例时,__add__ 将被隐式调用。

所以,你首先应该做的是初始化两个向量实例:

v1 = Vects(2, 5)
v2 = Vects(1, 7)

然后添加它们:

totalplus = v1 + v2

如果您添加一个漂亮的__str__ 以获得新向量的漂亮表示:

class Vects:
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def __add__(self, vect):
        total_x = self.x + vect.x
        total_y = self.y + vect.y
        return Vects(total_x, total_y)

    def __str__(self):
        return "Vector({}, {})".format(self.x, self.y)

您可以通过打印查看totalplus

print(totalplus)
Vector(3, 12)

【讨论】:

  • 我不会说通过直接调用从类中调用__add__ 方法,如MyClass.__add__(object1, object2),绝对没有用。好吧,Python 并不是真正为此类事情而设计的,但它可以用于非常复杂的强制转换情况,具有多重继承,人们希望调用另一个类的 __add__ 方法。由于某些原因。这有可能发生。比你想象的要快。我猜。
  • 当然,如果您想拥有良好的编程风格(请参阅PEP-8),则应将类称为Vector
  • @Rightleg 不确定用例;并且对于多重继承的目的,你永远不想硬编码一个类名(这是super存在的原因之一。)我并不是说一个用例可能不存在,只是这不是'如此一来,无需无缘无故地混淆 OP。
  • @JimFasarakis-Hilliard 是的,这就是为什么我没有将其发布为答案 xD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 2020-05-31
  • 2021-11-30
相关资源
最近更新 更多