首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python运算符重载不起作用

Python运算符重载不起作用
EN

Stack Overflow用户
提问于 2018-07-15 07:30:59
回答 1查看 507关注 0票数 1

我有一个Vector2类:

代码语言:javascript
复制
class Vector2():
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector2(self.x + other.x, self.y + other.y)

    def __sub__(self, other):
        return Vector2(self.x - other.x, self.y - other.y)

    def __mul__(self, other):
        return Vector2(self.x * other, self.y * other)

    def __neg__(self):
        return Vector2(-self.x, -self.y)

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

    @classmethod
    def distance(self, v1, v2):
        return math.sqrt((v2.x - v1.x) ** 2 + (v2.y - v1.y) ** 2)

    def normalize(self):
        return self * (1/self.magnitude())

当我尝试执行1.0 * Vector2()时,收到错误: TypeError:不支持*的操作数类型:'float‘和'instance’

然而,有时它会按预期工作:

代码语言:javascript
复制
#this works as intended, s is a float
ball.pos -= ball.vel.normalize() * s

ball.vel是一个向量,我可以乘以一个浮点数。在我的代码的许多部分中,向量乘以浮点数都没有错误。

有人知道这种不一致是从哪里来的吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-07-15 07:39:35

定义一个让a_float * a_vector正常工作的__rmul__方法。它可以像这样简单

代码语言:javascript
复制
def __rmul__(self, other):
    return self * other

其他运营商也有a dunder-r version。当没有为给定类型定义普通版本时,将调用这些反射运算符。有关NotImplemented内置常量的信息,请参阅文档。

表达式a * b等同于a.__mul__(b),除非ba类的子类的实例,或者a.__mul__(b)返回NotImplemented,在这种情况下返回的是b.__rmul__(a)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51344164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档