Python中构造函数和初始化器有什么区别?
可能重复的问题:
Python(和Python C API):new和init的区别
我现在在上大学,老师在讲课时把构造函数和初始化器这两个词混着用。我觉得这样是不对的。
我试着在网上搜索答案,但没有找到我想要的答案。
3 个回答
http://docs.python.org/reference/datamodel.html#basic-customization
__new__
- 这是一个构造函数,用来创建一个新的对象。
__init__
- 这是一个初始化函数,用来设置新创建对象的初始状态。
在大多数情况下,Python并没有像其他面向对象的语言那样的构造函数,因为手动管理内存通常是不推荐的。相反,你通常应该在类中定义一个__init__方法。这个方法会在新对象创建后自动被调用,用来初始化这个新实例。所以,它其实并不是真正的构造函数,把它称作构造函数可能会让一些人感到困惑。
当然,有些人想叫它构造函数,因为它的用法和构造函数有点像——从根本上说,你可以随便叫,只要大家都明白你在说什么就行。但一般来说,为了让自己说得更清楚,最好叫它初始化方法,或者用其他的名字,而不是构造函数。不同的编程语言有不同的术语,清楚地表达总是需要根据你的主题和听众进行调整。
在Python中,你可以更细致地管理对象的创建和销毁,不过除非你知道自己在做什么,否则不建议这样做。这是通过定义__new__和__del__方法来实现的,用于处理对象的实例化和删除语句。至于这些是否严格算作构造函数和析构函数,争论的余地就大了(Python文档称del方法为析构函数,但对构造函数的定义比较模糊,比如包括许多返回对象实例的函数)。我还是建议你使用该语言的具体术语,并在比较讨论中提前定义你的术语。总之,你在交流时选择的术语会影响听众的理解,有时可能会让他们感到困惑:如果你在谈论内存管理,尽量具体一些;但如果你在随意讨论,就用听众能理解的词,并准备好解释。
你的老师可能说得不够清楚,我不知道这些术语有没有一个权威的定义,但它们可能会让那些从其他语言学到非常具体定义的人感到困惑。
在大多数面向对象的编程语言中,这两个步骤是一样的,所以在像Java、C++这些语言中,他的说法是没错的。在Python中,这两个步骤是分开的:__new__
是构造函数;__init__
是初始化函数。
这里有一个更详细的回答,讲解了它们之间的区别。