2014-05-09 3 views
0

그래서 파이썬과 GAE의 상속 문제와 관련이 있다고 생각하는 버그로 약 2 시간을 낭비했습니다.파이썬 상속은 어떻게 GAE와 작동합니까?

내가 2 개 클래스, BlogHandler, 그리고 아이, LoginHandler 있습니다

class BlogHandler(webapp2.RequestHandler):  
     def __init__(self, request=None, response=None): 
      super(BlogHandler, self).__init__(request, response) 
      self.is_logged_in = False 

     def initialize(self, *args, **kwargs): 
      webapp2.RequestHandler.initialize(self, *args, **kwargs) 
      logging.warning('Checking for cookie') 

      if True: 
       self.is_logged_in = True 
       logging.warning('We are logged in!') 
      else: 
       logging.warning('We seem to be logged out') 

    class LoginHandler(BlogHandler):  
     def get(self): 
      logging.warning('Choose wisely!: + %s', self.is_logged_in) 
      if self.is_logged_in: 
       self.redirect(MAIN_URL) 
      else: 
       self.render("login.html") 

나는 클라이언트에서 GET 요청을받을 때마다의 initialize(self, *args, **kwargs) 방법은 아버지에 작동 한 후 get(self): 방법은 것입니다 아이를 돌보라.

이제 아버지가 변수, 자식 변수 is_logged_in을 공유하고 싶습니다. 나는 내가 항상 True 인 상태를 확인하려면 initialize(self, *args, **kwargs)를 실행할 때 변화의 100 %의 확률로 그래서 내가, 그리고

False으로 아버지의 생성자를 초기화 varible에 디폴트 값을 제공해야 의 변수는 True입니다.

자식에게, 나는 변수의 값을 확인하고 ... 은 항상 거짓이다. 나는 특별히이 변수의 값을 변경한다는 것을 알고 있기 때문에이 버그를 이해할 수 없다. 다음은 로그입니다.

WARNING 2014-05-09 22:50:52,062 blog.py:47] Checking for cookie 
WARNING 2014-05-09 22:50:52,062 blog.py:51] We are logged in! 
WARNING 2014-05-09 22:50:52,063 blog.py:116] Choose wisely!: + False 
INFO  2014-05-09 22:50:52,071 module.py:639] default: "GET /blog/login HTTP/1.1" 200 795 

왜 이런 일이 발생합니까? 나는 무엇을 이해하지 못합니까?

답변

2

시도의 변화 :

class BlogHandler(webapp2.RequestHandler): 
    def __init__(self, request=None, response=None): 
     self.is_logged_in = False 
     super(BlogHandler, self).__init__(request, response) 

슈퍼에 전화하기 전에 속성을 퍼팅.

+0

기다림 ... 무엇? 그것은 작동 ... 어떻게?! 어떤 종류의 마법이야? 왜 지금이 작품이 작동하는지 링크 또는 설명을 주시겠습니까? –

+0

@Flame_Phoenix, 나는 내 대답을 편집하려고했으나 Tim Hoffman이 나를 괴롭혔다. 죄송합니다. 귀하의 질문에 대답 할 때 약간의 깊이가 부족한 상태였습니다. –

3

제공되는 다른 답변으로 문제가 해결되지만 이유는 설명하지 않습니다.

이것은 GAE 또는 파이썬 상속의 실패와 아무 관련이 없습니다.

__init__ 메서드는 LoginHandler에서 상속되며 super 호출 후에 항상 is_logged_inFalse으로 설정합니다. 이것은 상속의 예상되는 동작입니다.

당신의 문제는 당신이 super를 호출 당신의 __init__ 당신은 당신이 즉시 그리고 무조건적으로 그것을 무시 자신의 initialize 방법에 무엇 이건 의미 is_logged_in을 설정하기 전에.

+0

이유를 설명하기 위해 내 대답을 편집하려고했는데, 설명 후에 필요하다고 생각하지 않습니까? –

+0

젠장 ... 나는 자바에서 왔어. 거기에서 super 메소드 (아버지 생성자)는 항상 첫 번째 라인이어야합니다. 나는 여기서 일들이 다르게 작동한다고 생각한다. 고마워 ! –

+0

문서에서 예제를 살펴보면 super를 호출하지도 않고 명시 적으로 '초기화'를 호출한다고합니다. –

관련 문제