0

是否可以显式调用__init__()函数?还是在实例化类的对象时总是调用该函数?

4

3 回答 3

4

__init__在实例化时调用。当您调用时some_instance = SomeClass(a, b),会使用和作为参数调用它。selfab

Python 有“我们都是同意的成年人”的座右铭,所以是的,你可以——但是每次你调用双下划线的方法时,你应该真正知道你在做什么,如果它破坏了某些东西,你必须面对后果。

大多数类都没有被设计为__init__在实例化之后调用,这将是一个奇怪的设计;如果您想调用some_instance.__init__(*args)以回收对象,只需调用一个新实例即可SomeClass(*args)-__init__不能保证调用会从现有实例重置状态,对此进行赌博将是糟糕的设计。

__init__除了__init__使用super. _

于 2013-09-02T15:34:37.290 回答
1

首先,__init__无论何时创建对象但实例化对象时都不会调用。对象创建的工作是 of __new__,它在之前被调用__init__,因此__new__被称为类的构造函数。请参阅__new__详细说明。回到问题上来,是的,有可能这样做。这是要演示的快速操作:

>>> class Test(object):
...     def __init__(self):
...         print "instantiating object"
... 
>>> t = Test()
instantiating object
>>> t.__init__()
instantiating object

谢谢!

于 2013-09-02T15:40:37.190 回答
0

Python 是一种非常宽松的语言,这也意味着你可以做一些你不应该做的事情。所以虽然__init__()是一个方法(这意味着你可以像任何其他方法一样直接调用它),结果因类而异。一些类在 中初始化了它们的所有状态__init__(),因此再次调用它会有效地重置类。其他类的行为不同,并且不能保证一个类总是以一种或另一种方式表现。

通常,当您需要两步初始化(即创建类,进行一些设置然后真正初始化)时,就会出现这个问题。为此创建一个新init()方法:

a = A()
a.setFoo(foo)
a.init()

同样,如果您的类支持重置,请添加一个reset()方法。

于 2013-09-02T15:41:15.347 回答