Python构造函数和_init__

Python构造函数和_init__,python,Python,为什么构造函数真的被称为“构造函数”?它们的目的是什么?它们与类中的方法有何不同 另外,一个类中是否可以有多个\uuuuu init\uuuu?我试了以下方法,有人能解释一下结果吗 >>> class test: def __init__(self): print "init 1" def __init__(self): print "init 2" >>> s=test

为什么构造函数真的被称为“构造函数”?它们的目的是什么?它们与类中的方法有何不同

另外,一个类中是否可以有多个
\uuuuu init\uuuu
?我试了以下方法,有人能解释一下结果吗

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

>>> s=test()
init 2

最后,
\uuuuu init\uuuuu>是运算符重载吗?

Python中没有函数重载,这意味着不能有多个同名但参数不同的函数

在代码示例中,您没有重载
\uuuu init\uuuu()
。发生的情况是,第二个定义将名称
\uuuu init\uuuu
重新绑定到新方法,从而使第一个方法无法访问


至于你关于构造器的一般问题,这是一个很好的起点。对于特定于Python的东西,我强烈推荐。

类只是用来创建对象的蓝图。构造函数是每次创建对象时运行的一些代码。因此,有两个构造器是没有意义的。所发生的是第二个写在第一个上面

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

>>> class testing:
...     def __init__(self, init_value):
...         self.some_value = init_value
>>> testobject = testing(5)
>>> class testing:
...     def __init__(self):
...         self.some_value = 5
那么您可以做的是从这个类创建一个对象,如下所示:

>>> class testing:
...     def __init__(self, init_value):
...         self.some_value = init_value
>>> testobject = testing(5)
>>> class testing:
...     def __init__(self):
...         self.some_value = 5
testobject将有一个名为
some_value
的对象,在本示例中该值为5

>>> testobject.some_value
5
但您不需要像我在示例中那样为每个对象设置值。您也可以这样做:

>>> class testing:
...     def __init__(self, init_value):
...         self.some_value = init_value
>>> testobject = testing(5)
>>> class testing:
...     def __init__(self):
...         self.some_value = 5
然后某个_值的值将为5,并且在创建对象时不必设置它

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

>>>和。。。在我的样本中不是你写的。这是pyshell中的外观…

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


在您的类定义中,它只保留了后面的一个

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

构造函数(名为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
)创建并返回类的新实例。因此,
C.\uuuuu new\uuuuu
类方法是类C的构造函数

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

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

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

他们的目的是什么?

构造函数
C.\uuuuu new\uuuu
的目的是定义新
C
实例构造期间的自定义行为

初始化器
C.\uuu init\uuu
的目的是定义
C
的每个实例在创建后的自定义初始化

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

class Test(object):
    pass

t = Test()

t.x = 10   # here you're building your object t
print t.x
但是,如果您希望
Test
的每个实例的属性
x
都等于10,则可以将该代码放在
\uuuu init\uuu
中:

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

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

t = Test(10)
print t.x
z = Test(20)
print t.x
每个实例方法(对类的特定实例调用的方法)都将实例作为其第一个参数接收。该参数按惯例命名为
self

类方法,例如构造函数
\uuuuu new\uuuuu
,接收类作为其第一个参数

现在,如果您想要为
x
属性定制值,您所要做的就是将该值作为参数传递给
\uuuuu init\uuuu

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

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

t = Test(10)
print t.x
z = Test(20)
print t.x

我希望这将帮助您消除一些疑问,因为您已经收到了其他问题的好答案,我将在这里停止:)

Python中没有方法重载的概念。但是您可以通过指定可选参数和关键字参数来实现类似的效果

这是否也意味着源文件是按顺序解析(解释?)的?我能确定我以后定义的任何函数都会覆盖以前定义的同名函数吗(我的问题听起来很傻……我应该知道的it@0xc0de:在Python中,函数定义实际上是可执行语句,并且自上而下运行,因此是。@0xc0de实际发生的情况是类的主体在它自己的命名空间中执行,然后该命名空间被传递给元类(其中包括名称和基)。然后,函数定义只是创建一个具有指定主体的函数,并将其分配给它的名称。
\uuuuuu init\uuuu
的最后一个赋值将在类中结束。没问题,很高兴它对您有所帮助:)从技术上讲,
\uuuuuuu init\uu
是一个初始化器。python构造函数是
\uuuu new\uuuu
。Python使用自动两阶段初始化-
\uuuuuuuuuuuuuuuuuu
返回一个有效但(通常)未填充的对象(请参见
bool
,了解反例),然后自动调用该对象。这避免了C++语言与部分构造对象的问题——在Python中从来没有一个(尽管它可能是部分初始化的)。在类中,你几乎不需要重写“代码”>“x”、“代码”>“代码”>“第二”,“我不确定在C++中部分构造的对象是什么意思。@ C++中的PHReNeLL,在基类构造函数中,对象的类型是基类(不是子类)。您不能在基类构造函数中调用虚方法并让子类提供实现。在Java中,可以在基类构造函数中调用子类方法,但子类成员变量将在基类构造函数(和方法调用)之后自动初始化。在具有两阶段初始化的语言(如Python)中,您可以愉快地调用基类初始化器中的方法,并让子类提供(或ove)