为什么 __init__() 总是在 __new__() 之后调用?

新手上路,请多包涵

我只是想简化我的一个类,并引入了一些与 享元设计模式 风格相同的功能。

但是,我有点困惑为什么 __init__ 总是在 __new__ 之后调用。我没想到会这样。谁能告诉我为什么会这样,否则我该如何实现这个功能? (除了将实现放入 __new__ 感觉很老套。)

这是一个例子:

 class A(object):
    _dict = dict()

    def __new__(cls):
        if 'key' in A._dict:
            print "EXISTS"
            return A._dict['key']
        else:
            print "NEW"
            return super(A, cls).__new__(cls)

    def __init__(self):
        print "INIT"
        A._dict['key'] = self
        print ""

a1 = A()
a2 = A()
a3 = A()

输出:

 NEW
INIT

EXISTS
INIT

EXISTS
INIT

为什么?

原文由 Dan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 264
2 个回答

当您需要控制新实例的创建时,使用 __new__

当您需要控制新实例的初始化时,使用 __init__

__new__ 是创建实例的第一步。它首先被调用,并负责返回你的类的一个新实例。

相反, __init__ 不返回任何东西;它只负责实例创建后的初始化。

通常,您不需要重写 __new__ 除非您要子类化不可变类型,例如 str、int、unicode 或 tuple。

来自 2008 年 4 月的帖子: 何时使用 __new____init__ 在 mail.python.org 上。

您应该考虑到您尝试做的事情通常是通过 工厂 完成的,这是最好的方法。使用 __new__ 不是一个好的清洁解决方案,因此请考虑使用工厂。这是一个很好的例子: ActiveState Fᴀᴄᴛᴏʀʏ ᴘᴀᴛᴛᴇʀɴ Recipe

原文由 mpeterson 发布,翻译遵循 CC BY-SA 4.0 许可协议

__new__ 是静态类方法,而 __init__ 是实例方法。 __new__ 必须先创建实例,所以 __init__ 可以初始化它。请注意 __init__self 作为参数。在创建实例之前,没有 self

现在,我了解到您正在尝试在 Python 中实现 单例模式。有几种方法可以做到这一点。

此外,从 Python 2.6 开始,您可以使用类 装饰器

 def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance

@singleton
class MyClass:
  ...

原文由 vartec 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题