python - 从复杂对象覆盖 __init__

标签 python inheritance

我想要一个自定义的 complex 类,它可以获取一个字符串作为输入 ("1 2") 并读取 realimag 部分。

class myComplex(complex):
    def __init__(self, inp):
        real, imag = inp.split()
        self.real = float(real)
        self.imag = float(imag)


comp = myComplex("1 2")
print comp # (1+2j)

但是我得到了错误:

Traceback (most recent call last):
  File "my_complex.py", line 8, in <module>
    comp1 = myComplex(inp1)
ValueError: complex() arg is a malformed string

这是否意味着我的 __init__ 没有覆盖 complex 中的那个,还是我遗漏了一些基本的东西?

最佳答案

Python 的complex__new__ 中分配了realimag 的值。 .

__new____init__ 之前运行,负责对象的创建。执行(考虑 myComplexcomplex)是这样的:

  1. myComplex("1 1")

  2. myComplex.__new__(cls, inp)

  3. complex.__new__(cls, real, imag)

  4. myComplex.__init__(self, inp)

(没有 complex.__init__ 因为 myComplex.__init__ 没有调用它)

这意味着参数 "1 2"__init__ 运行之前被解析。

你应该覆盖 __new__:

class myComplex(complex):
    def __new__(cls, inp):
        real, imag = inp.split()
        return super(myComplex, cls).__new__(cls, float(real), float(imag))

关于python - 从复杂对象覆盖 __init__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34245353/

相关文章:

python - 根据索引矩阵对 numpy 矩阵进行排序

python - Django-如何创建在序列化器中设置深度的关系对象?

python - 朴素贝叶斯分类问题 - ValueError : domain math error

javascript - 要求 OPTIONS 的 DOJO AJAX 请求

c++ - 模板继承 : There are no arguments that depend on a template parameter

java - 我可以在 Java 中使用子类对象作为参数来覆盖吗?

C++从基类指针访问派生类成员

scala - 构造函数(特征)不能应用于(类扩展特征)

类中的 java 构造函数不能应用于给定类型

python - Pip 安装但找不到模块