从派生类访问父类的属性

时间:2011-06-14 11:52:22

标签: python google-app-engine

我是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

如何访问类的父属性?

3 个答案:

答案 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.requestself.response未由webapp中的类构造函数设置。当框架调用处理程序的initialize方法时,它们会稍后设置。您可以覆盖它,只需确保在执行任何其他操作之前调用父类的initialize