运行以下代码时出错:
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
有什么问题?
答案 0 :(得分:48)
该方法应命名为__init__
作为构造函数,而不是_init_
。 (注意双下划线。)
如果使用单个下划线,则只创建名为_init_
的方法,并获取默认构造函数,该构造函数不带参数。
答案 1 :(得分:9)
为__init__
使用双下划线。
class Person:
def __init__(self, name):
(Python中的所有special methods以双重而非单个下划线开头和结尾。)
答案 2 :(得分:3)
您应该使用双下划线(__init__
)( Python中的Dunder或magic方法)来声明python构造函数。
__init__
在__new__
创建实例之后调用,并用于自定义创建的对象。
在实例创建后(由 new ())调用,但在实例返回给调用者之前调用。参数是传递给类构造函数表达式的参数。如果基类具有 init ()方法,则派生类的 init ()方法(如果有)必须显式调用它,以确保正确初始化基类的一部分。实例;例如:super()。初始([args ...])。
因为 new ()和 init ()在构造对象( new ()创建对象,然后 init ()进行自定义), init ()不会返回任何非值;这样做将导致在运行时引发TypeError。
在python中,我们有两种类型的 Constructor :
self
)。def __init__(self):
# default constructor
self
参数之外还接受其他参数。def __init__(self, parameters):
# parameterized constructor
如果不声明参数化构造函数,则python使用默认的构造函数,该构造函数不接受任何参数。因此,您将一个参数传递给默认构造函数,并且已引发异常。
如何解决?
只需声明一个参数化的构造函数,即可通过该实例化实例。
Python3:
class Person:
def __init__(self, name):
self.name = name