У меня есть класс, который определяет специальный метод __complex__
. Мой класс не является стандартной числовой тип (целый, дробный и т.д.), но он ведет себя, как один, как я специальные методы определены для __add__
, __sub__
и т.д.Класс специальный метод поведение __complex__
Я хотел бы __complex__
вернуть мой комплекснозначной числовой объект , а не стандартное комплексное числовое значение, которое ожидает python. Таким образом, Python выдает следующую ошибку, когда я пытаюсь вернуть свой объект, а не стандартный комплексный числовой.
TypeError: unsupported operand type(s) for *: 'complex' and 'MyNumericClass'
Каков наилучший способ для этого?
Edit:
# Python builtins
import copy
# Numeric python
import numpy as np
class MyNumericClass (object):
""" My numeric class, with one single attribute """
def __init__(self, value):
self._value = value
def __complex__(self):
""" Return complex value """
# This looks silly, but my actual class has many attributes other
# than this one value.
self._value = complex(self._value)
return self
def zeros(shape):
"""
Create an array of zeros of my numeric class
Keyword arguments:
shape -- Shape of desired array
"""
try:
iter(shape)
except TypeError, te:
shape = [shape]
zero = MyNumericClass(0.)
return fill(shape, zero)
def fill(shape, value):
"""
Fill an array of specified type with a constant value
Keyword arguments:
shape -- Shape of desired array
value -- Object to initialize the array with
"""
try:
iter(shape)
except TypeError, te:
shape = [shape]
result = value
for i in reversed(shape):
result = [copy.deepcopy(result) for j in range(i)]
return np.array(result)
if __name__ == '__main__':
a_cplx = np.zeros(3).astype(complex)
print a_cplx
b_cplx = zeros(3).astype(complex)
print b_cplx
Немного сложно догадаться, в чем проблема, если не увидеть код. Вы определили '__rmul __()'? –
Готово. См. Фрагмент. Спасибо –
Я получаю 'TypeError: __complex__ должен возвращать сложный объект' после запуска вашего фрагмента. Возможно, вы хотели вернуть 'self._value' вместо' self'? Когда я его заменю, печатаются две строки: '[0. + 0.j 0. + 0.j 0. + 0.j]' и '[0. + 0.j 0. + 0.j 0. + 0.j] '. Я на Python 2.7.3. – dbkaplun