为什么构造函数确实被称为“构造函数”?他们的目的是什么?他们与班级中的方法有什么不同?
此外,课程中可以有更多__init__
吗?我尝试了类似下面的内容,有人可以解释一下结果吗?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
最后,__init__
是一个运算符重载器吗?
答案 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
在你的课程定义中,它只保留后一个