【发布时间】:2012-02-17 15:20:18
【问题描述】:
为什么构造函数确实被称为“构造函数”?它们的目的是什么?它们与类中的方法有何不同?
另外,一个班级可以有更多的__init__ 吗?我尝试了以下方法,有人可以解释一下结果吗?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
最后,__init__ 是运算符重载器吗?
【问题讨论】:
-
从技术上讲,
__init__是一个初始化程序。 python 构造函数是__new__。 Python 使用自动两阶段初始化 -__new__返回一个有效但(通常)未填充的对象(参见bool的反例),然后自动调用__init__。这避免了像 C++ 这样的语言对部分构造对象的问题——在 Python 中你永远不会有一个(尽管它可能是部分初始化的)。您几乎不需要在一个类上同时覆盖__new__和__init__。 -
@TimDelaney:我不确定你对 C++ 中部分构造的对象的意思。
-
@phresnel 在 C++ 中,对象的类型是基类(而不是子类),而在基类构造函数中。您不能在基类构造函数中调用虚方法并让子类提供实现。在 Java 中,您可以在基类构造函数中调用子类方法,但子类成员变量将在 基类构造函数(和方法调用)之后自动初始化。在像 Python 这样具有两阶段初始化的语言中,您可以愉快地调用基类初始化程序中的方法并让子类提供(或覆盖)行为。
-
@TimDelaney:啊,谢谢你的澄清。
-
@TimDelaney。我认为您的评论应该取代接受的答案。
标签: python