【问题标题】:"This constructor takes no arguments" error in __init____init__ 中的“此构造函数不接受任何参数”错误
【发布时间】:2025-12-10 02:25:02
【问题描述】:

运行以下代码时出现错误:

class Person:
  def _init_(self, name):
    self.name = name

  def hello(self):
    print 'Initialising the object with its name ', self.name

p = Person('Constructor')
p.hello()

输出是:

Traceback (most recent call last):  
  File "./class_init.py", line 11, in <module>  
    p = Person('Harry')  
TypeError: this constructor takes no arguments

有什么问题?

【问题讨论】:

  • 答案指出__init__使用双下划线。但是您收到错误消息的原因是默认情况下,您的类提供了一个从object 继承的空__init__(self) 方法。由于您没有覆盖该方法,因此它是被调用的方法。
  • 在类似的拼写错误情况下(在这种情况下是一个下划线而不是两个下划线)我通过将方法命名为 __ini__ 陷入了同样的错误

标签: python python-3.x


【解决方案1】:

该方法应命名为 __init__ 以作为构造函数,而不是 _init_。 (注意双下划线。)

如果您使用单下划线,您只需创建一个名为 _init_ 的方法,并获得一个不带参数的默认构造函数。

【讨论】:

    【解决方案2】:

    __init__ 使用双下划线。

    class Person:
      def __init__(self, name):
    

    (Python 中的所有special methods 都以双下划线开头和结尾,而不是单下划线。)

    【讨论】:

    • Here 是 Python 使用双下划线的由来。
    【解决方案3】:

    您应该使用双下划线 (__init__)(python 中的 Dunder 或魔术方法) 来声明 python 构造函数。

    Basic customization:

    __init____new__创建实例后调用,用于自定义创建的对象。

    在创建实例之后(通过new())调用,但在它返回给调用者之前。参数是传递给类构造函数表达式的参数。如果基类有 init() 方法,则派生类的 init() 方法(如果有)必须显式调用它以确保正确初始化实例;例如:super().init([args...]).

    因为 new() 和 init() 在构造对象时协同工作(new() 来创建它,而 init () 自定义),init() 不能返回非None 值;这样做会导致在运行时引发 TypeError。

    我们在python中有两种构造函数

    • 默认构造函数: 不声明参数化构造函数时使用。它的定义只有一个参数,即对正在构造的实例的引用(a.k.a self)。
    def __init__(self):
        # default constructor 
    
    • 参数化构造函数:除了self参数之外还接受其他参数。
    def __init__(self, parameters):
        # parameterized constructor 
    

    如果你不声明参数化构造函数,python 使用不带任何参数的默认构造函数。因此,您将参数传递给默认构造函数并引发了异常。

    如何解决?

    只需声明一个参数化构造函数,您可以通过它实例化您的实例。

    Python3:

    class Person:
        def __init__(self, name):
            self.name = name
    

    【讨论】:

      最近更新 更多