为什么总是在__new __()之后调用__init __()?

和:

我只是想简化我的一个类,并以与flyweight设计模式相同的样式介绍了一些功能

但是,对于为什么__init__总是调用after ,我有点困惑__new__我没想到这一点。谁能告诉我为什么会这样,否则我如何实现此功能?(除了将实现放到__new__hacky中之外)。

这是一个例子:

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

为什么?

mpeterson:

使用__new__时,你需要控制一个新实例的创建。

使用__init__时,你需要一个新的实例的控件初始化。

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

相反,__init__什么都不返回;创建实例后,它仅负责初始化实例。

通常,__new__除非您要继承不可变类型(如str,int,unicode或tuple),否则无需重写

从2008年4月后:当使用__new__对比__init__在mail.python.org上。

您应该考虑的是,通常要通过Factory完成,这是最好的方法。使用__new__不是一个好的清洁解决方案,因此请考虑使用工厂。在这里,您有一个很好的工厂示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么总是在mouseDoubleClickEvent之前调用mousePressEvent

为什么构造函数总是在堆栈上调用?

为什么总是在 blazor 中调用“HandleValidSubmit()”

为什么UDPSocket.send总是在Ruby中调用getaddrinfo?

总是在onError之后为WebSocket调用onclose

如何让vim总是在任何拉动之后调用函数

initState() 方法中的异步函数调用是否总是在 Flutter 中的 build() 方法之后调用?

为什么选项的位置总是在变化?

凝视总是在PointExit之后执行

是否总是在调度程序调用之后进行时间中断?

为什么在startActivityForResult之后调用oncreate方法?

为什么onSaveInstanceState在onPause之后调用

为什么memset在calloc之后调用?

为什么在 UITapGestureRecognizer 之后调用 touchesCancelled?

为什么状态总是 0,即使在使用 useCallback 之后

为什么 while 循环之后的语句并不总是执行?

为什么在onAreaTouched调用之后,会调用onSceneTouchEvent()事件?

为什么 toString 总是在严格模式下运行?

为什么TODO总是在vim中突出显示?

为什么我的ubuntu ip总是在变化?

为什么总是在JavaScript中声明函数?

Android版式:为什么我的按钮总是在ListView的下面?

为什么在If中总是在someArray中对someVar进行赋值

为什么这个项目总是在Makefile中执行?

为什么`xmodmap` 并不总是在登录时加载`.Xmodmap`?

为什么总是在以后绘制SVG对象?

为什么我的momentjs总是在03显示分钟?

为什么mysqld总是在后台运行?

为什么我提供init()函数时调用init(coder :)