35

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

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

有什么问题?

4

3 回答 3

57

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

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

于 2012-09-16T16:05:12.757 回答
11

对 .使用双下划线__init__

class Person:
  def __init__(self, name):

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

于 2012-09-16T16:05:07.237 回答
3

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

基本定制:

__init__在实例创建后调用__new__并用于自定义创建的对象。

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

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

我们在 python 中有两种类型的构造函数:

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

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

如何解决?

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

Python3:

class Person:
    def __init__(self, name):
        self.name = name
于 2020-08-18T14:46:35.733 回答