Python 访问父类';派生类的属性
我是python和GAE的新手,我认为python将作为任何其他OO语言使用,但显然不是。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
\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)
对吗?我的假设正确吗?