Python &引用;此构造函数不接受任何参数";初始化时出错__

Python &引用;此构造函数不接受任何参数";初始化时出错__,python,python-3.x,Python,Python 3.x,运行以下代码时出现错误: 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 "./clas

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

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
回溯(最近一次呼叫最后一次):
文件“/class_init.py”,第11行,在
p=人(“哈里”)
TypeError:此构造函数不接受任何参数

有什么问题吗?

\uuuu init\uuuu
使用双下划线

class Person:
  def __init__(self, name):

(Python中的所有字符都以双下划线开始和结束,而不是单下划线。)

\uuuu init\uuuu
使用双下划线

class Person:
  def __init__(self, name):

(在Python中,所有方法的开头和结尾都是双下划线,而不是单下划线。)

该方法应命名为
\uuuu init\uuuu
作为构造函数,而不是
\uu init
。(请注意双下划线。)


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

该方法应命名为
\u init\u
作为构造函数,而不是
\u init\u
。(请注意双下划线。)


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

应该使用双下划线(
\u init\u
)(Dunder或python中的magic methods)来声明python构造函数

\uuuuu init\uuuuuuuu
创建实例后调用,用于自定义创建的对象

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

由于new()和init()在构造对象时一起工作(new()创建对象,而init()自定义对象),因此init()不能返回非无值;这样做将导致在运行时引发TypeError

python中有两种类型的构造函数

  • 默认构造函数:在不声明参数化构造函数时使用。它的定义只有一个参数,它是对正在构造的实例的引用(也称为self)
def\uuuu初始化(自):
#默认构造函数
  • 参数化构造函数:除了
    self
    参数之外,还接受其他参数
def\uuuuu init\uuuuuu(自身,参数):
#参数化构造函数
如果不声明参数化构造函数,python将使用默认构造函数,该构造函数不接受任何参数。因此,您向默认构造函数传递了一个参数,并引发了异常

如何修复它?

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

蟒蛇3:

班级人员:
定义初始化(self,name):
self.name=名称

您应该使用双下划线(
\uuuu init\uuuu
)(Dunder或python中的magic方法)来声明python构造函数

\uuuuu init\uuuuuuuu
创建实例后调用,用于自定义创建的对象

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

由于new()和init()在构造对象时一起工作(new()创建对象,而init()自定义对象),因此init()不能返回非无值;这样做将导致在运行时引发TypeError

python中有两种类型的构造函数

  • 默认构造函数:在不声明参数化构造函数时使用。它的定义只有一个参数,它是对正在构造的实例的引用(也称为self)
def\uuuu初始化(自):
#默认构造函数
  • 参数化构造函数:除了
    self
    参数之外,还接受其他参数
def\uuuuu init\uuuuuu(自身,参数):
#参数化构造函数
如果不声明参数化构造函数,python将使用默认构造函数,该构造函数不接受任何参数。因此,您向默认构造函数传递了一个参数,并引发了异常

如何修复它?

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

蟒蛇3:

班级人员:
定义初始化(self,name):
self.name=名称

这就是Python使用双下划线的原因。是Python使用双下划线的方式。答案指出,
\uuuu init\uuu
使用双下划线。但是,您得到错误消息的原因是,默认情况下,您的类提供了一个从
对象继承的空
\uuuu init\uuuuu(self)
方法。由于您没有重写该方法,因此调用了该方法。对于类似的打字错误(在本例中是一个下划线而不是两个下划线),我也犯了同样的错误,将方法命名为
\uu ini\uu
,答案为