Ответ 1
В Python 3.x вам нужно перегрузить операторы __floordiv__
и __truediv__
, а не оператор __div__
. Первая соответствует операции //
(возвращает целое число), а вторая - в /
(возвращает float).
Недавно я начал преподавать программирование игры. Кто-то рекомендует мне начать с Python, и я получил книгу "Начало разработки игры с Python и Pygame: от новичка до профессионала". Я добрался до части, где они учат об векторах и создают класс Vector2. Все шло хорошо, пока я не попытался перегрузить оператора деления. Мой код выглядит следующим образом:
class Vector2(object):
def __init__(self, x=0.0, y=0.0):
self.x = x
self.y = y
def __str__(self):
return "(%s, %s)"%(self.x, self.y)
@classmethod
def from_points(cls, P1, P2):
return cls(P2[0] - P1[0], P2[1] - P1[1])
def __add__(self,rhs):
return Vector2(self.x + rhs.x, self.y + rhs.y)
def __sub__(self,rhs):
return Vector2(self.x - rhs.x, self.y - rhs.y)
def __mul__(self, scalar):
return Vector2( self.x*scalar, self.y*scalar)
def __div__(self, scalar):
return Vector2( self.x/scalar, self.y/scalar)
Теперь, когда я попытался вызвать оператор "/", это показывает:
AB = Vector2(10.0,25.0)
print(AB) # <<<<(10.0, 25.0)
v1 = AB + Vector2(20.,10.)
print(v1) # <<<<(30.0, 35.0)
v2 = AB - Vector2(20.,10.)
print(v2) # <<<<(-10.0, 15.0)
v3 = AB * 3
print(v3) # <<<<(30.0, 75.0)
print(v3 / 3)
TypeError: unsupported operand type(s) for /: 'Vector2' and 'int'
Это все было в Python 3.3, но если я запустил его с Python 2.7, все будет работать правильно. Где проблема?
В Python 3.x вам нужно перегрузить операторы __floordiv__
и __truediv__
, а не оператор __div__
. Первая соответствует операции //
(возвращает целое число), а вторая - в /
(возвращает float).
В Python 3 операторы деления называются __truediv__
и __floordiv__
. Дополнительную информацию см. В документации Модель данных.