Python构造函数和__init__

Ari*_*ury 99 python

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

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

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


>>> s=test()
init 2
Run Code Online (Sandbox Code Playgroud)

最后,是__init__一个运算符overloader?

NPE*_*NPE 109

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

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

至于你关于构造函数的一般问题,维基百科是一个很好的起点.对于Python特定的东西,我强烈推荐Python文档.

  • @ 0xc0de:在Python中,函数定义实际上是*可执行语句*并且从上到下运行,所以是的. (4认同)

Rik*_*ggi 63

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

因为__new__构建你的对象.

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

正如在创建实例时调用官方文档 C.__new__所述,其他方法不会接受此处理.

他们的目的是什么?

目的是让您在创建时按照自己的意愿构建对象.

例如,Python允许您执行以下操作:

class Test(object):
    pass

t = Test()

t.x = 10   # here you're building your object t
print t.x
Run Code Online (Sandbox Code Playgroud)

但是如果你希望每个实例C.__init__都有一个__init__等于10 的属性,你可以在里面pyt代码C.__new__:

class Test(object):
    def __init__(self):
        self.x = 10

t = Test()
print t.x
Run Code Online (Sandbox Code Playgroud)

'self'只是用作方法函数的第一个参数的标准单词,因为在我们的例子中,第一个参数是对象实例(class/static -methods 除外)C.

现在,如果您想要C.__init__属性的自定义值,您只需要将该值作为参数传递给C:

class Test(object):
    def __init__(self, x):
        self.x = x

t = Test(10)
print t.x
z = Test(20)
print t.x
Run Code Online (Sandbox Code Playgroud)

我希望这会帮助你澄清一些疑问,既然你已经收到了其他问题的好答案,我会在这里停下来:)


Nic*_*son 9

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

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

>>> class testing:
...     def __init__(self, init_value):
...         self.some_value = init_value
Run Code Online (Sandbox Code Playgroud)

那么你可以做的是从这个类创建一个对象,如下所示:

>>> testobject = testing(5)
Run Code Online (Sandbox Code Playgroud)

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

>>> testobject.some_value
5
Run Code Online (Sandbox Code Playgroud)

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

>>> class testing:
...     def __init__(self):
...         self.some_value = 5
Run Code Online (Sandbox Code Playgroud)

那么some_value的值将是5,你不必在创建对象时设置它.

>>> testobject = testing()
>>> testobject.some_value
5
Run Code Online (Sandbox Code Playgroud)

我的样本中的>>>和...不是你写的.它是pyshell的外观......