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子类对象时,所产生的实例对象对应的类并不一定会是该子类,有可能是其他类。。。
no copyright !! 个人原创博客欢迎转载,可以不保留出处。