源码中 有注释: initialize vs init chosen for compatibility with AsyncHTTPClient singleton magic. If we get rid of that we can switch to init here too.
看了下 AsyncHTTPClient 但是我还是不太明白
1
vipppppp 2019-04-27 09:42:37 +08:00
最近第一次使用 tornado,这个框架基本是让使用者使用 initialize 而不是 __init__
|
2
vipppppp 2019-04-27 09:50:07 +08:00
最近第一次使用 tornado,这个框架基本是让使用者使用 initialize 而不是 __init__ ,我也很疑惑。
刚刚回过头看 Configurable 都源码, 发现有意思的是 initialize 是在__new__中调用的,而我们知道的是__init__是在__new__返回才调用的。 那么结合它的注释,这个差别在与单例模式是十分有区别的。 如果在单例模式中,__init__还是会被调用,如果在__init__进行了初始化工作,那么全局的实例(其实都是一个对象),属性都会被重置。而如果在 initialize 中,我们可以只在第一个实例化都时候进行初始化工作。 简单都模拟一下: class Singleton: _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(Singleton, cls).__new__(cls) cls._instance.initialize() return cls._instance def initialize(self): self.age = 18 class Test(Singleton): def __init__(self): self.name = 'test' t1 = Test() t1.name = 'test1' t1.age = 19 print(t1.name, t1.age) # test1, 19 t2 = Test() print(t1.name, t1.age) # test, 19 print(t2.name, t1.age) # test, 19 仅仅是个人看法,如果错误,欢迎纠正,小白一枚。。。 其他区别我也看不出。 |