所以,我现在浪费了大约两个小时的bug,我认为它与python和GAE中的继承问题有关。
我有2个班级BlogHandler
和孩子LoginHandler
:
class BlogHandler(webapp2.RequestHandler):
def __init__(self, request=None, response=None):
super(BlogHandler, self).__init__(request, response)
self.is_logged_in = False
def initialize(self, *args, **kwargs):
webapp2.RequestHandler.initialize(self, *args, **kwargs)
logging.warning('Checking for cookie')
if True:
self.is_logged_in = True
logging.warning('We are logged in!')
else:
logging.warning('We seem to be logged out')
class LoginHandler(BlogHandler):
def get(self):
logging.warning('Choose wisely!: + %s', self.is_logged_in)
if self.is_logged_in:
self.redirect(MAIN_URL)
else:
self.render("login.html")
每当我从客户端收到GET请求时,initialize(self, *args, **kwargs)
方法将在父进程中运行,然后get(self):
方法将在该子进程上运行。
现在我希望父亲与孩子共享变量is_logged_in
变量。我必须给varible一个默认值,所以我在父的构造函数中将其初始化为False
然后,当我运行initialize(self, *args, **kwargs)
时,我会检查一个始终为True
的条件,因此它有100%的机会将is_logged_in
变量更改为True
回到孩子,我检查所述变量的值,并且...... 总是为假。我无法理解这个错误,特别是因为我知道我正在改变所述变量的值。这是一个日志:
WARNING 2014-05-09 22:50:52,062 blog.py:47] Checking for cookie
WARNING 2014-05-09 22:50:52,062 blog.py:51] We are logged in!
WARNING 2014-05-09 22:50:52,063 blog.py:116] Choose wisely!: + False
INFO 2014-05-09 22:50:52,071 module.py:639] default: "GET /blog/login HTTP/1.1" 200 795
为什么会这样?我不理解的是什么?
答案 0 :(得分:3)
提供的另一个答案为您解决了,但没有解释原因。
这与GAE无关,或者python继承失败。
在您的情况下,__init__
方法由LoginHandler继承,并且在is_logged_in
调用后始终将False
设置为super
。这是继承的预期行为。
问题是您在设置super
之前在__init__
中呼叫is_logged_in
,这意味着无论您使用自己的initialize
方法做什么,都会立即无条件地覆盖它
答案 1 :(得分:2)
尝试更改:
class BlogHandler(webapp2.RequestHandler):
def __init__(self, request=None, response=None):
self.is_logged_in = False
super(BlogHandler, self).__init__(request, response)
在调用super之前设置属性。