2012-06-08 5 views
0

У меня есть класс, который определяет специальный метод __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 
+3

Немного сложно догадаться, в чем проблема, если не увидеть код. Вы определили '__rmul __()'? –

+0

Готово. См. Фрагмент. Спасибо –

+0

Я получаю '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

ответ

3

Несколько вариантов:

  1. Определение __rmul__ (или определить __mul__ и переворачивать операнды умножения).
  2. Внесите свой MyNumericClass экземпляр в complex перед умножением.
+1

Незначительная точка: у python нет следов (где вы говорите, что то, что в памяти на самом деле является другим типом), вы превращаете его в совершенно новый объект (который может иметь последствия для памяти/производительности). – Daenyth

+0

Я смущен ваше предлагаемое решение. Я не пытаюсь размножаться, я пытаюсь вернуть объект с комплексными значениями, учитывая реальность. Например, я хотел бы преобразовать реальный массив моих объектов в сложный, 'x = mylib.zeros (shape) .astype (complex)' , который будет похож на numpy 'x = np.zeros (форма) .astype (complex) ' mylib.zeros создает массив нулей моего пользовательского числового объекта, аналогичный numpy. –

+0

Не могли бы вы предоставить минимальный пример, который вызывает вышеупомянутый TypError? – dbkaplun

Смежные вопросы