2013-12-13 1 views
0

Я хочу использовать псевдоним для webApp2 self.response.out.write или self.response.write функции. КакКак сделать псевдоним self.response.write в WebApp2

from __future__ import print_function 
class M: 
    def __init__(self): 
     self.echo ('BOO BOO') 
    def f(self, data) : 
     print (data) 
    echo = f 

a = M() 
a.echo(' ALIASED FUNCTION ') 

Я попытался

class Main(webapp2.RequestHandler): 

    def fun(self): 
     self.response.out.write ('FUNNY') 

    def get(self): 
     self.response.headers['Content-Type'] = 'text/html' 
     self.response.write('DERIVED CLASS') 
     self.aliasOut() 
     self.aliasFun() 

    def post(self): 
     pass 

    aliasOut = response.out.write # NameError: name 'response' is not defined 
    aliasFun = fun     # This works 

ответ

2

вопрос вы работаете в том, что self является локальной переменной Whithin каждого метода. Вы не можете сделать переменную класса, содержащую self.response.out.write, потому что self не определено на верхнем уровне класса. Я думаю, что есть два возможных решения:

Проще всего просто сделать локальный псевдоним в любом методе, который собирается назвать self.response.out.write много:

def i_write_a_lot(self): 
    alias = self.response.out.write 
    alias("stuff") 
    alias("more stuff") 
    alias("yet more stuff") 

Другим вариантом было бы сделать псевдоним property объект в классе, поэтому его можно получить в любом месте класса. Это гораздо менее очевидно, о том, где псевдоним приходит, что может привести к путанице, когда кто-то другой (или, несколько месяцев спустя) читает ваш код, но он приходит ближе к тому, что вы хотели:

@property 
def alias(self): 
    return self.response.out.write 

def method1(self): 
    self.alias("stuff") 

def method2(self): 
    self.alias("other stuff") 
0

Благодаря @Blckknght, два метода, которые вы предложили, все они работают.

Я знаю, что это сбивает с толку. Я изменил свой код, чтобы сделать его менее запутанным :) Полный минимальный шаблон AppEngine здесь:

#!/usr/bin/env python 
import webapp2 


class MainHandler(webapp2.RequestHandler): 

    def get(self): 
     self.echo('BOO BOO') 
     self.echoHtml(' METHOD 2 ') 
     # To save more key strokes. I improved it slightly. Trust me, I tested it :) 
     echo = self.echo 
     echoHtml = self.echoHtml 
     echo ('HORA ') 
     echoHtml ('HAYDAAA ! ') 

    def echo(self, context): 
     alias = self.response.out.write 
     alias(context) 

    @property 
    def echoHtml(self): 
     return self.response.out.write 




app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
], debug=True) 
0

Я пришел другое решение, я создал базовый класс для WebApp2Request Хэндлер, и использовать этот базовый класс вместо webapp2 .RequestHandler

import webapp2 

class Webapp2FactoryClass(webapp2.RequestHandler):  
    def echo(self, context): 
     self.response.out.write(context) 

    def __init__(self, *args, **kwargs): 
     super(Webapp2FactoryClass, self).__init__(*args, **kwargs) 
     self.args = args 
     self.kwargs = kwargs 

class MainHandler(Webapp2FactoryClass):  
    def __init__(self, *args, **kwargs): 
     super(MainHandler, self).__init__(*args, **kwargs) 
     self.args = args 
     self.kwargs = kwargs 

    def get(self, *args, **kwargs): 
     self.echo('Bumbala') 
Смежные вопросы