Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 访问父类';派生类的属性_Python_Google App Engine - Fatal编程技术网

Python 访问父类';派生类的属性

Python 访问父类';派生类的属性,python,google-app-engine,Python,Google App Engine,我是python和GAE的新手,我认为python将作为任何其他OO语言使用,但显然不是。\uuuinit\uuu(self):函数如何在以下代码中为我提供不同的结果 class BaseHandler(webapp.RequestHandler): @property def current_user(self): if not hasattr(self, "_current_user"): self._current_user = No

我是python和GAE的新手,我认为python将作为任何其他OO语言使用,但显然不是。
\uuu
init
\uuu
(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

如何访问类的父属性?

如果查看您的
SubmitHandler
类,您会注意到它确实没有
请求属性--。在尝试访问
self.current\u user
之前,您可能需要调用parentclass
\uuuu init\uuuu
方法


作为旁注,您应该意识到在
SubmitHandler
类中定义的
template\u值有一个class属性,因此在该类的所有实例之间共享。由于您在
\uuuu init\uuuu
中为其指定了特定于实例的内容,因此您可能希望将其改为实例属性。在
\uuu init\uuu
方法中将其分配给
self.template\u值。

Python的对象继承没有什么特别的不同

通过定义
\uuuu init\uuuu
,您已经告诉Python,初始化对象只需完成这些操作。因此,您拒绝了它运行超类初始化代码的机会。您需要调用
super

def __init__(self, *args, **kwargs):
    super(SubmitHandler, self).__init__(*args, **kwargs)
    self.template_values['current_user'] = self.current_user

但是,这可能无法解决您的问题-您没有考虑到
self.request
在程序中的另一点初始化的可能性,这就是为什么它在调用
get
时工作。

self.request
self.response
不是由webapp中的类构造函数设置的。稍后,当框架调用处理程序的
initialize
方法时,会设置它们。您可以重写此方法,只需确保在执行任何其他操作之前调用父类的
initialize

是否需要调用RequestHandler的
\uuuu init\uuuu
方法来设置请求变量?很抱歉,Kristo,我不太理解您的问题。但似乎我没有?但为什么我从get(self)函数访问它时它才工作,而从
\uuuuu
init(self)函数它不工作?在instance属性中也注意到,我将在
\uuuu
init\uuuu>函数中移动声明。
\uuuuu init\uuuu
是一个常规方法,它只是在对象生命周期的早期(创建之后)被调用。如果它不存在于
\uuuuu init\uuu
中,但它稍后确实存在,属性显然是由
\uuuu init\uuuu
之后执行的某个操作设置的。不过,我认为@Daniel Roseman上面关于“您没有考虑self.request在程序中的另一点初始化的可能性”的回答是有意义的。我想我必须创建另一个函数,并从get和post函数调用它来设置self.template_values dict。或者您还有其他建议吗?我认为您对self的看法是正确的。请求在程序中的另一个点初始化。但是,如果self.request在父类的
\uuuuu init\uuuuu
处初始化,则在调用
super(SubmitHandler,self)之后,应该可以在SubmitHandler'\uuuuu init\uuu`上访问它。\uuuuuuu init\uuu(*args,**kwargs)
对吗?我的假设正确吗?