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