def__new__(cls, **kwargs): base = cls.configurable_base() args = {} # 做一个类型判断,以便不影响直接实例化具体子类 if cls is base: impl = cls.configured_class() if base.__impl_kwargs: args.update(base.__impl_kwargs) else: impl = cls args.update(kwargs) instance = super(Configurable, cls).__new__(impl) # initialize vs __init__ chosen for compatiblity with AsyncHTTPClient # singleton magic. If we get rid of that we can switch to __init__ # here too. # # AsyncHTTPClient 中默认为每一个 IOLoop 实例对应一个 AsyncHTTPClient 实例。 # 其重写了 __new__ 方法指定了两个命名参数:io_loop,force_instance,为了兼容 # 这个初始化过程,这里选择使用 initialize 而不是 __init__ 来初始Configurable # 实例。如果能摆脱这个约束的话,我们便可以在这里使用 __init__ 方法。 instance.initialize(**args) return instance
@classmethod defconfigurable_default(cls): """根据不同平台类选择具体的 IOLoop 类型。""" if hasattr(select, "epoll"): from tornado.platform.epoll import EPollIOLoop return EPollIOLoop if hasattr(select, "kqueue"): # Python 2.6+ on BSD or Mac from tornado.platform.kqueue import KQueueIOLoop return KQueueIOLoop from tornado.platform.select import SelectIOLoop return SelectIOLoop