Python构造函数和__init__

时间:2012-01-24 11:11:10

标签: python

为什么构造函数确实被称为“构造函数”?他们的目的是什么?他们与班级中的方法有什么不同?

此外,课程中可以有更多__init__吗?我尝试了类似下面的内容,有人可以解释一下结果吗?

>>> class test:
    def __init__(self):
        print "init 1"
    def __init__(self):
        print "init 2"


>>> s=test()
init 2

最后,__init__是一个运算符重载器吗?

4 个答案:

答案 0 :(得分:106)

Python中没有函数重载,这意味着你不能拥有多个具有相同名称但不同参数的函数。

在您的代码示例中,您不是重载 __init__()。会发生的是第二个定义将名称__init__重新绑定到新方法,使第一个方法无法访问。

关于构造函数的一般问题,Wikipedia是一个很好的起点。对于特定于Python的内容,我强烈推荐Python docs

答案 1 :(得分:60)

为什么构造函数确实被称为“构造函数”?

构造函数(名为__new__)创建并返回该类的新实例。因此C.__new__类方法是类C的构造函数

在创建特定实例后,会在特定实例上调用C.__init__实例方法,以便在传递回调用方之前对其进行初始化。因此,该方法是C的新实例的初始化

它们与班级中的方法有什么不同?

official documentation __init__中所述,在创建实例后调用 。其他方法不接受这种治疗。

他们的目的是什么?

构造函数C.__new__的目的是在构造新的C实例期间定义自定义行为。

初始化程序C.__init__的目的是在创建C之后定义每个class Test(object): pass t = Test() t.x = 10 # here you're building your object t print t.x 实例的自定义初始化。

例如Python允许你这样做:

Test

但如果您希望 x的每个实例的属性__init__等于10,您可以将该代码放在class Test(object): def __init__(self): self.x = 10 t = Test() print t.x 中:

self

每个实例方法(在类的特定实例上调用的方法)都接收实例作为其第一个参数。该参数通常命名为__new__

类方法(例如构造函数x)将接收类作为它们的第一个参数。

现在,如果您想要__init__属性的自定义值,您只需将该值作为参数传递给class Test(object): def __init__(self, x): self.x = x t = Test(10) print t.x z = Test(20) print t.x

{{1}}

我希望这会帮助你澄清一些疑问,因为你已经收到了其他问题的好答案,我将在此停止:)

答案 2 :(得分:9)

类只是从中创建对象的蓝图。构造函数是每次创建对象时运行的一些代码。因此,拥有两个构造函数是没有意义的。会发生什么是第二次写第一次。

您通常使用它们的是为该对象创建变量,如下所示:

>>> class testing:
...     def __init__(self, init_value):
...         self.some_value = init_value

那么你可以做的就是从这个类创建一个对象:

>>> testobject = testing(5)

然后测试对象将有一个名为some_value的对象,在此示例中将为5。

>>> testobject.some_value
5

但是你不需要像我在我的样本中那样为每个对象设置一个值。你也可以这样做:

>>> class testing:
...     def __init__(self):
...         self.some_value = 5

然后some_value的值将为5,您不必在创建对象时设置它。

>>> testobject = testing()
>>> testobject.some_value
5

>>>和...在我的样本中不是你写的。这就是它在pyshell中的样子......

答案 3 :(得分:1)

在创建新对象时会自动调用coonstructors,从而“构造”对象。您可以拥有多个 init 的原因是因为名称只是python中的引用,并且您可以随时更改每个变量引用的内容(因此动态键入)

def func(): #now func refers to an empty funcion
    pass
...
func=5      #now func refers to the number 5
def func():
    print "something"    #now func refers to a different function

在你的课程定义中,它只保留后一个