深刻tornado中的Configurable

Configurable十分重要! 位於tornado.util文件中,它是一個工廠類。html

咱們暫且稱這個類爲 配置類 。java

咱們暫且約定:該類的子類稱之爲 直屬配置子類 , 該類的孫類、重孫類……稱之爲 從屬配置子類。就像這樣:tornado

複製代碼
class Configurable(object):  # 配置類
    pass

class IOLoop(Configurable):  # 直屬配置子類
    pass

class PollIOLoop(IOLoop):  # 從屬配置子類
    pass
複製代碼

這個配置類相似於java中的接口,他要求 直屬配置子類必須有三個方法,分別是:oop

`configurable_base`  `configurable_default` 'initialize'

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

複製代碼
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__方法。blog

  他的子類能夠直接不用定義__init__方法,但必須使用initialize方法來替代__init__接口

  另外,當實例化Configurable子類對象時,所產生的實例對象對應的類並不必定會是該子類,有多是其餘類。。。get

相關文章
相關標籤/搜索