我是python和GAE的新手,我认为python会像其他任何OO语言一样,但显然不是。 __
init __
(self):函数如何在以下代码中给出不同的结果?
class BaseHandler(webapp.RequestHandler):
@property
def current_user(self):
if not hasattr(self, "_current_user"):
self._current_user = None
cookie = facebook.get_user_from_cookie(self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
user = User.get_by_key_name(cookie["uid"])
return self._current_user
class SubmitHandler(BaseHandler):
template_values = dict(facebook_app_id=FACEBOOK_APP_ID)
def __init__(self):
#throws error : AttributeError: 'SubmitHandler' object has no attribute 'request'
self.template_values['current_user'] = self.current_user
def get(self):
#this one function is error free
self.template_values['current_user'] = self.current_user
如何访问类的父属性?
答案 0 :(得分:3)
如果你查看你的SubmitHandler
课程,你会注意到它确实没有request
属性 - 至少,你没有设置,没有你给父类a机会设定。在尝试访问__init__
之前,您可能需要调用父类self.current_user
方法。
作为旁注,你应该意识到你在template_values
类中定义的SubmitHandler
字典有一个类属性,因此在所有实例之间共享类。由于您在__init__
中为其指定了特定于实例的内容,因此您可能意味着它将成为实例属性。在self.template_values
方法中将其分配到__init__
。
答案 1 :(得分:0)
Python的对象继承没有什么特别不同。
通过定义__init__
,您告诉Python,这是初始化对象所需要做的全部工作。因此,你否认它有机会运行超类的初始化代码。您需要致电super
:
def __init__(self, *args, **kwargs):
super(SubmitHandler, self).__init__(*args, **kwargs)
self.template_values['current_user'] = self.current_user
但这可能无法解决您的问题 - 您没有考虑到self.request
在程序中的另一个点初始化的可能性,这就是为什么它在get
时的工作原理调用。
答案 2 :(得分:0)
self.request
和self.response
未由webapp中的类构造函数设置。当框架调用处理程序的initialize
方法时,它们会稍后设置。您可以覆盖它,只需确保在执行任何其他操作之前调用父类的initialize
。