2013-12-13 20 views
0

我想为webApp2使用别名self.response.out.writeself.response.write函数。像如何在WebApp2中别名self.response.write

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')