【发布时间】:2011-11-06 00:50:51
【问题描述】:
我想知道如何调用 __init__() 方法。是__new__() 调用它,还是__call__() 在它使用__new__() 或其他方式创建实例后调用它?
【问题讨论】:
-
你可以看看这里:rafekettler.com/magicmethods.html 但是一般new首先被调用,而init通常在实例创建之后被调用。
我想知道如何调用 __init__() 方法。是__new__() 调用它,还是__call__() 在它使用__new__() 或其他方式创建实例后调用它?
【问题讨论】:
Python 判断 __new__() 是否应该调用 __init__():
如果 __new__() 被覆盖并且不返回类的实例,则如果 __new__() 返回一个 cls 的实例,那么新实例的 __init__() 方法将像 __init__(self[, ...]) 一样被调用,其中 self 是新实例,其余参数与被传递给 __new__()。
__init__() 将不会被调用。
__call__() 在实例对象像函数一样被调用时被调用:
class MyObj:
def __call__():
print 'Called!'
>>> mo = MyObj()
>>> mo()
Called!
当然,您可以使用任何您想要的参数和逻辑来定义 __call__()。
【讨论】:
__new__ 而不调用 __init__,只要您返回该类的实例,它仍然会被调用。
__init__ 每当 __new__ 返回一个cls 的实例,即使它已经被初始化(例如, 正在从缓存中返回);如果返回值不是cls 的实例,它不会调用任何类型的__init__。
__new__ 不像文档和@Karl 所说的那样调用__init__,它在某些情况下会自动调用。
__call__(尽管他不知道)是 metaclass__call__ 方法/i>,在本例中为type,其中MyObj 是一个实例。这就是当你做MyObj() 时被调用的那个,它包含了这个逻辑。
__init__ 在对象实例化时调用
http://docs.python.org/reference/datamodel.html#object.__init__
【讨论】: