如何解决从派生类访问父类的属性
| 我是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
如何访问该类的父级属性?
解决方法
如果查看
SubmitHandler
类,您会注意到它确实没有request
属性-至少没有设置,也没有给父类设置的机会。也许您需要做的是在尝试访问self.current_user
之前调用parentclass__init__
方法。
附带说明一下,您应该意识到,在ѭ3inside类中定义的template_values
字典有一个class属性,因此在该类的所有实例之间共享。由于您在ѭ5中为它分配了特定于实例的内容,因此您可能想让它成为实例属性。用__init__
方法将其分配给self.template_values
。
, Python的对象继承没有什么特别的不同。
通过定义ѭ5,您已经告诉Python,这是初始化对象所需要做的全部工作。因此,您将拒绝它运行超类的初始化代码的机会。您需要致电super
:
def __init__(self,*args,**kwargs):
super(SubmitHandler,self).__init__(*args,**kwargs)
self.template_values[\'current_user\'] = self.current_user
但是,这可能无法解决您的问题-您没有考虑到在程序的另一点初始化self.request
的可能性,这就是为什么在调用get
时它可以工作的原因。
, webapp中的类构造函数未设置self.request
和self.response
。当框架调用处理程序的initialize
方法时,将对它们进行设置。您可以覆盖它,只需确保在执行其他操作之前调用父类的initialize
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。