深入tornado中的Configurable

Posted 叶祖辉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入tornado中的Configurable相关的知识,希望对你有一定的参考价值。

Configurable十分重要! 位于tornado.util文件中,它是一个工厂类。

我们暂且称这个类为 配置类 。

我们暂且约定:该类的子类称之为 直属配置子类 , 该类的孙类、重孙类……称之为 从属配置子类。就像这样:

复制代码
class Configurable(object):  # 配置类
    pass

class IOLoop(Configurable):  # 直属配置子类
    pass

class PollIOLoop(IOLoop):  # 从属配置子类
    pass
复制代码

这个配置类类似于java中的接口,他要求 直属配置子类必须有三个方法,分别是:

`configurable_base`  `configurable_default` \'initialize\'

另外,在Configurable中定义了 __new__方法:

复制代码
class Configurable(object):  # 配置类
    \'\'\'
    要求其直属配置子类必须有以下三个方法:
        `configurable_base`      一般返回该直属配置子类自身
        `configurable_default`     返回该直属配置子类的执行类对象
        \'initialize\'             该直属配置子类的初始化方法
    \'\'\'
    def __new__(cls, *args, **kwargs)
        \'\'\'
        解析出impl对象    
            1 cls是直属配置子类时,impl就是该直属配置子类的\'执行类对象\'
            2 cls是从属配置子类时,impl就是该从属配置子类自身
        然后实例化一个impl实例对象
        运行其initialize方法,并传入合并后的参数
        返回该impl实例对象
        \'\'\'
        base = cls.configurable_base()   
        init_kwargs = {}
        if cls is base:
            impl = cls.configured_class()
            if base.__impl_kwargs:
                init_kwargs.update(base.__impl_kwargs)
        else:
            impl = cls
        init_kwargs.update(kwargs)
        instance = super(Configurable, cls).__new__(impl)
        instance.initialize(*args, **init_kwargs)
        return instance
复制代码

不太清楚__new__方法作用的同学请移步:Python中的__init__和__new__

Configurable之所以这么重要,是因为他重写了__new__方法。

  他的子类可以直接不用定义__init__方法,但必须使用initialize方法来替代__init__

  另外,当实例化Configurable子类对象时,所产生的实例对象对应的类并不一定会是该子类,有可能是其他类。。。

 

以上是关于深入tornado中的Configurable的主要内容,如果未能解决你的问题,请参考以下文章

深入tornado中的协程

深入tornado中的IOStream

深入tornado中的TCPServer

深入tornado中的ioLoop

深入tornado中的ioLoop

深入tornado中的ioLoop