【问题标题】:What method calls `__init__()` in Python classes什么方法在 Python 类中调用 `__init__()`
【发布时间】:2011-11-06 00:50:51
【问题描述】:

我想知道如何调用 __init__() 方法。是__new__() 调用它,还是__call__() 在它使用__new__() 或其他方式创建实例后调用它?

【问题讨论】:

标签: python class methods


【解决方案1】:

Python 判断 __new__() 是否应该调用 __init__():

如果 __new__() 返回一个 cls 的实例,那么新实例的 __init__() 方法将像 __init__(self[, ...]) 一样被调用,其中 self 是新实例,其余参数与被传递给 __new__()。

如果 __new__() 被覆盖并且不返回类的实例,则

__init__() 将不会被调用。

__call__() 在实例对象像函数一样被调用时被调用:

class MyObj:
  def __call__():
    print 'Called!'

>>> mo = MyObj()
>>> mo()
Called!

当然,您可以使用任何您想要的参数和逻辑来定义 __call__()。

【讨论】:

  • 更准确地说,它是由 Python 运行时隐式调用的。您可以编写自己的 __new__ 而不调用 __init__,只要您返回该类的实例,它仍然会被调用。
  • 确实如此!虽然这应该谨慎使用,就像 Python 的大多数方法重载一样。
  • 需要注意的重要一点... Pythnon 的运行时将调用__init__ 每当 __new__ 返回一个cls 的实例,即使它已经被初始化(例如, 正在从缓存中返回);如果返回值不是cls 的实例,它不会调用任何类型的__init__
  • 你真的应该编辑这个。 __new__ 不像文档和@Karl 所说的那样调用__init__,它在某些情况下会自动调用。
  • 另外,只是想注意...@yasar 可能指的是__call__(尽管他不知道)是 metaclass__call__ 方法/i>,在本例中为type,其中MyObj 是一个实例。这就是当你做MyObj() 时被调用的那个,它包含了这个逻辑。
【解决方案2】:

__init__ 在对象实例化时调用

http://docs.python.org/reference/datamodel.html#object.__init__

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-28
    • 2011-04-16
    • 2012-07-23
    • 2020-11-06
    • 2021-06-10
    • 1970-01-01
    • 2021-07-21
    • 2018-01-03
    相关资源
    最近更新 更多