【问题标题】:How to inherit class complex in python? [duplicate]如何在python中继承类复杂? [复制]
【发布时间】:2020-04-21 08:14:23
【问题描述】:

我正在处理一个需要处理复数的项目。我在 python 中使用预定义的类复合体。但我想为预定义的实现添加更多属性。

我尝试通过自定义类继承类,像这样

class C(complex):
    def __init__(self,x,y):
        complex.__init__(self,x,y)

但它显示错误

TypeError: object.__init__() takes exactly one argument (the instance to initialize)

任何人都可以建议从 python 中的类 complex 继承的正确方法吗?谢谢!!

【问题讨论】:

  • 这能回答你的问题吗? Subclassing int in Python基本一样,虽然那个问题的内置类型是int。
  • 一个只调用超类的__init__ 可能不存在。

标签: python


【解决方案1】:

您需要使用不带任何额外参数的super() 初始化complex,如下所示:

class C(complex):
    def __init__(self, x, y):
        super().__init__()

编辑:

或者干脆

class C(complex):
    '''No need of defining any constructors'''
    ...
    def someOtherMethod(*args,**kargs):
        pass

即。继承内置类不需要定义任何构造函数。

【讨论】:

  • 是的,你是对的,不需要真正重新实现构造函数。由于提供的示例,我认为这是需要的,并且在子类化时这是很常见的事情。
【解决方案2】:

你需要调用超类。

class C(complex):
    def __init__(self,x,y):
        super(C, self).__init__()

complexNumber = C(1,2)
print(complexNumber)
# (1+2j)

【讨论】:

  • 你忽略了参数x,y,那有什么意义呢?
  • @quamrana,由于复杂类接收 2 个变量,构造函数会自动处理 x 和 y。运行代码并检查它是否有效。如果你愿意,你可以在 C 类初始化中用 x 和 y 做一些事情
  • 我的意思是,你拥有的和class C(complex): pass没有区别。
【解决方案3】:

保持类参数不变可能更容易:

class C(complex):
    def __new__(cls, *args, **kwargs):
        return complex.__new__(cls, *args, **kwargs)

c = C()
print(c)
d = C(1, 2)
print(d)

输出:

0j
(1+2j)

【讨论】:

  • 我无法让您的代码正常工作。 object.__init__() 抱怨。
  • 好的,但是您的答案现在与副本相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2013-05-14
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2015-03-17
  • 2020-07-20
相关资源
最近更新 更多