1. 程式人生 > >深入tornado中的Configurable

深入tornado中的Configurable

blog return default __new__ 不一定 base 參數 。。 object

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