是否可以显式调用__init__()
函数?还是在实例化类的对象时总是调用该函数?
3 回答
__init__
在实例化时调用。当您调用时some_instance = SomeClass(a, b)
,会使用和作为参数调用它。self
a
b
Python 有“我们都是同意的成年人”的座右铭,所以是的,你可以——但是每次你调用双下划线的方法时,你应该真正知道你在做什么,如果它破坏了某些东西,你必须面对后果。
大多数类都没有被设计为__init__
在实例化之后调用,这将是一个奇怪的设计;如果您想调用some_instance.__init__(*args)
以回收对象,只需调用一个新实例即可SomeClass(*args)
-__init__
不能保证调用会从现有实例重置状态,对此进行赌博将是糟糕的设计。
__init__
除了__init__
使用super
. _
首先,__init__
无论何时创建对象但实例化对象时都不会调用。对象创建的工作是 of __new__
,它在之前被调用__init__
,因此__new__
被称为类的构造函数。请参阅__new__
详细说明。回到问题上来,是的,有可能这样做。这是要演示的快速操作:
>>> class Test(object):
... def __init__(self):
... print "instantiating object"
...
>>> t = Test()
instantiating object
>>> t.__init__()
instantiating object
谢谢!
Python 是一种非常宽松的语言,这也意味着你可以做一些你不应该做的事情。所以虽然__init__()
是一个方法(这意味着你可以像任何其他方法一样直接调用它),结果因类而异。一些类在 中初始化了它们的所有状态__init__()
,因此再次调用它会有效地重置类。其他类的行为不同,并且不能保证一个类总是以一种或另一种方式表现。
通常,当您需要两步初始化(即创建类,进行一些设置然后真正初始化)时,就会出现这个问题。为此创建一个新init()
方法:
a = A()
a.setFoo(foo)
a.init()
同样,如果您的类支持重置,请添加一个reset()
方法。