关于__init__
昨天晚上写python代码,写到很晚,一直到今天早上。这期间我都在纠结一个问题,那就是GAE的webapp.RequestHandler类到底是怎么抽风了,总是出现莫名奇妙的错误,现在我总算是理清楚头绪了。把思想过程记录下来吧。
首先,定义一个类,class BaseRequestHandler(webapp.RequestHandler),这个是所有的RequestHandler的父类,因为它把一些基本的的处理已经做好了,它的子类就不需要重新处理了。
接下来,我又定义了一个子类,class Home(BaseRequestHandler),然后给它一个__init__方法,def __init__(self)。其实我想让Home只有这么一个方法,其它的让它的父类都定义好。但是问题来了,那就是没有__init__还好,有了之后服务器就出现了问题了。trace说Home没有response属性,我查了一下,一直查到库,查到了,发现webapp.RequestHandler根本没有__init__这个方法,它只有一个initialize方法,里面定义了self.response属性。
这下我就纠结了,我一直继承下来,按理说Home应该也有initialize这个方法的啊,这样它就有了self.response的属性了。但是怎么调试都出错,除非去掉__init__方法。这里看来,很可能是没运行initialize这个方法了。
但是为什么有了__init__就不运行initialize()了呢?我还去网上找了好久__init__和initialize的关系。当然,最后都以失败告终。
最后,实在受不了了,去看了库里的webapp.WSGIApplication的源代码,发现它是运行handler的initialize方法的,这样这个handler就有了response属性了。
这样就比较清楚了,但是当时我一直一位我定义的Home没有initialize这个方法,因为它没有response属性。现在看来,是当时想错了。Home有initialize方法来初始化self.response和self.request属性的。但是它的__init__方法首先就调用了self.response属性来赋值,而且还是Home在被引用或者或者调用的时候就运行。这个时候webapp.WSGIApplication还没有初始化initialize。
说的很不清楚,但是,留着以后看就行了。
总结:最关键的是没有搞懂python的运行机制,如果了解了这些规律,就不怕出现一些让人摸不着头脑的问题了。
