【问题标题】:Python 3 classes __init__() missing 1 required positional argumentPython 3 类 __init__() 缺少 1 个必需的位置参数
【发布时间】:2023-03-27 10:10:02
【问题描述】:

代码如下:

class Complex:
    def __init__(self, real, imaginary):
        self.real = real
        self.imaginary = imaginary
    def __str__(self):
        return "{}+({}i)".format(self.real, self.imaginary)
    def add(self, second):
        return Complex(self.real + second.real, self.imaginary + second.imaginary)
    def subtract(self, second):
        return Complex(self.real - second.real, self.imaginary - second.imaginary)
    def multiply(self, second):
        return Complex(self.real * second.real - self.imaginary * second.imaginary, self.imaginary * second.real + \
                       self.real * second.imaginary)
    def divide(self, second):
        x = float(second.real ** 2 + second.imaginary ** 2)
        return Complex(self.real * second.real + self.imaginary * second.imaginary)/(x) + (self.imaginary * second.real - self.real * second.imaginary)/(x)

x = Complex(5,-8)
y = Complex(-1,3)


print(Complex.multiply(x,y))
print(Complex.divide(x,y))

错误是:

Traceback (most recent call last):
  File "D:/PyCharm Community Edition 2017.3.2/PyCharmProjects/lab9/venv/lab9.3.py", line 23, in <module>
    print(Complex.divide(x,y))
  File "D:/PyCharm Community Edition 2017.3.2/PyCharmProjects/lab9/venv/lab9.3.py", line 16, in divide
    return Complex(self.real * second.real + self.imaginary * second.imaginary)/(x) + (self.imaginary * second.real - self.real * second.imaginary)/(x)
TypeError: __init__() missing 1 required positional argument: 'imaginary'

所以我查看了其他类似的线程,发现不仅要初始化方法,还要初始化诸如 Complex().divide(x,y) 之类的类,但随后它说缺少 2 个实数和虚数参数,任何想法非常感谢您的解释。

【问题讨论】:

  • 我认为它应该更像print(x.multiply(y))。但理想情况下,您可能会将方法重命名为 __mul__ 并执行 print(x * y)
  • 阅读该行。你认为你通过了多少个论点?你认为括号如何匹配?哎呀,你甚至看到任何逗号吗?
  • 乘法函数实际上工作得很好
  • 也许,但我坚持我的意见。我的意思是对所有操作都做同样的事情。但是正如@user2357112 所说,您的直接问题在于divide 方法的return 行。您不会同时传递实值和虚值。如果是我,我可能至少会将 imaginary 设为默认为 0 的关键字参数。
  • 你知道 Python 在语言中内置了复数吗?

标签: python arguments init


【解决方案1】:

您必须首先使用__init__ 方法所需的参数初始化您的类,然后,使用该类的实例,调用您希望使用的任何方法。

x = Complex(5, -8)
y = Complex(-3, 3)
m = x.multiply(y)
d = x.divide(y)
print(m, d)

对于已初始化的类,其方法的第一个参数(self)会自动传递;您只需要剩下的。在您的情况下,唯一要传递的参数是second

更新

再看一遍后,我意识到这不是问题的根源,尽管您应该将其视为良好实践的指南。

要解决您的错误,只需在您在 divide 调用中启动的 Complex 声明中传递另一个参数。您的课程目前需要两个参数,而您只传递了一个(密切注意没有昏迷)。

【讨论】:

  • 我还是不太明白。我哪里缺乏昏迷? print(Complex.divide(x,y)) 我在这里传递了 2 个参数:x 和 y,就像我想要的那样,有什么问题?
  • 您在divide方法的return语句之前的Complex定义中缺少逗号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多