Python 类特殊方法行为\uuuu复杂__

Python 类特殊方法行为\uuuu复杂__,python,Python,我有一个类定义了\uuuuu complex\uuuu特殊方法。我的类不是一个标准的数字类型(int、float等),但它的行为类似于一个,因为我为\uuuu add\uuuu、\uu sub\uu等定义了特殊的方法 我希望\uuuuuuuuuuuuuuuuuuuuuuuuu返回我的复数数值对象,而不是python期望的标准复数数值。因此,当我尝试返回我的对象而不是标准的复杂数值时,Python会抛出以下错误 TypeError:不支持*:“复杂”和“”的操作数类型 “MyNumericClas

我有一个类定义了
\uuuuu complex\uuuu
特殊方法。我的类不是一个标准的数字类型(int、float等),但它的行为类似于一个,因为我为
\uuuu add\uuuu
\uu sub\uu
等定义了特殊的方法

我希望
\uuuuuuuuuuuuuuuuuuuuuuuuu
返回我的复数数值对象,而不是python期望的标准复数数值。因此,当我尝试返回我的对象而不是标准的复杂数值时,Python会抛出以下错误

TypeError:不支持*:“复杂”和“”的操作数类型 “MyNumericClass”

最好的方法是什么


编辑:

有两种选择:

  • 定义
    并翻转乘法操作数
  • 在相乘之前,将您的
    MyNumericClass
    实例强制转换为
    complex
  • 有两种选择:

  • 定义
    并翻转乘法操作数
  • 在相乘之前,将您的
    MyNumericClass
    实例强制转换为
    complex

  • 在没有看到代码的情况下,很难猜测问题可能是什么。您是否定义了
    \uu rmul\uuu()
    ?完成。请看片段。ThanksI get
    TypeError:\uuuu complex\uuu在运行代码段后应返回一个复杂对象。也许您是想返回
    self.\u value
    而不是
    self
    ?当我替换它时,会打印两行:
    [0.+0.j0.+0.j0.+0.j]
    [0.+0.j0.+0.j]
    。我使用的是Python 2.7.3。如果我返回self.\u值,它只返回属性。我想返回整个对象,所以返回self.\u值不是我想要的。发生该类型错误的原因是
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我不确定实现我想要的功能的正确方法是什么。我希望我可以使用特殊的方法来保持python友好,但这可能是不可能的?如果不看代码,就很难猜测问题出在哪里。您是否定义了
    \uu rmul\uuu()
    ?完成。请看片段。ThanksI get
    TypeError:\uuuu complex\uuu在运行代码段后应返回一个复杂对象。也许您是想返回
    self.\u value
    而不是
    self
    ?当我替换它时,会打印两行:
    [0.+0.j0.+0.j0.+0.j]
    [0.+0.j0.+0.j]
    。我使用的是Python 2.7.3。如果我返回self.\u值,它只返回属性。我想返回整个对象,所以返回self.\u值不是我想要的。发生该类型错误的原因是
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我不确定实现我想要的功能的正确方法是什么。我希望我可以使用这个特殊的方法来保持python友好,但这可能是不可能的。次要的一点:python没有强制转换(你告诉语言内存中的内容实际上是另一种类型),你可以将它转换成一个全新的对象(这可能会影响内存/性能)你提出的解决办法把我弄糊涂了。我不是在尝试乘法,而是在给定实数的情况下返回一个复数对象。例如,我想将一个真实的对象数组转换为复数,
    x=mylib.zeros(shape).astype(complex)
    ,它类似于numpy
    x=np.zeros(shape).astype(complex)
    mylib.zeros创建一个自定义数值对象的零数组,类似于numpy。您能提供一个导致上述类型错误的最小示例吗?小点:python没有强制转换(您告诉语言内存中的内容实际上是另一种类型),您可以将其转换为一个全新的对象(可能会影响内存/性能)。我对您提出的解决方案感到困惑。我不是在尝试乘法,而是在给定实数的情况下返回一个复数对象。例如,我想将一个真实的对象数组转换为复数,
    x=mylib.zeros(shape).astype(complex)
    ,它类似于numpy
    x=np.zeros(shape).astype(complex)
    mylib.zeros创建一个自定义数值对象的零数组,与numpy类似。您能提供一个导致上述类型错误的最小示例吗?
    # 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