【问题标题】:Overloading __init__() method results in error [duplicate]重载 __init__() 方法会导致错误[重复]
【发布时间】:2015-07-23 14:00:04
【问题描述】:

我在一个类中有两个构造函数,但是当我调用其中一个(一个有一个参数的 - 只有自己的 - 而不是一个有 4 个参数的)时,它会导致错误,说它期望的参数比1 个。

类是如下方式:

class Message:
def __init__(self):
    self.data = None

def __init__(self, type, length, data):
    self.type = type
    self.length = length
    self.data = data

和对它的调用(我也得到错误的地方):

msg = Message()

问题可能出在哪里?难道不能和C++相提并论吗?如果没有,我怎样才能以另一种方式获得相同的结果?

【问题讨论】:

  • Python 不允许这种行为 - 第二个 __init__ 完全替换第一个。 “难道它不能与 C++ 相提并论吗?” - 只是你可以说它不像 C++!
  • 从技术上讲,__init__ 不是构造函数,而是初始化程序。它接收一个已经构建的对象作为参数。 __new__ 是构造函数。

标签: python oop


【解决方案1】:

一个类中不能有两个__init__ 方法。

您的代码实际上所做的是覆盖第一个方法,因此它永远不会被使用,然后您会收到错误,因为您没有提供足够的参数。

解决此问题的一种方法是使用关键字参数提供默认值。这样,如果您创建没有值的 Message 对象,它将使用默认值。下面的示例使用None 作为默认值,但它可能更复杂:

class Message(object):

    def __init__(self, type=None, length=None, data=None):
        self.type = type
        self.length = length
        self.data = data

【讨论】:

    【解决方案2】:

    Python 不是这样工作的。使用这个:

    class Message:
        def __init__(self, type=None, length=None, data=None):
            self.type = type
            self.length = length
            self.data = data
    

    【讨论】:

      猜你喜欢
      • 2014-03-27
      • 1970-01-01
      • 2019-06-22
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-16
      • 2015-07-29
      相关资源
      最近更新 更多