执行功能而不向其发送“self”

时间:2011-03-15 14:38:41

标签: python google-app-engine

是否可以定义一个函数而不用这种方式引用self

def myfunc(var_a,var_b)

但是它也可以获取发件人数据,就像我定义它一样:

def myfunc(self, var_a,var_b)

self总是相同的,所以在这里看起来有点多余,总是以这种方式运行一个函数:myfunc(self,'data_a','data_b')。然后我想在函数中获取它的数据,如sender.fields

更新 这里有一些代码可以更好地理解我的意思。 下面的类用于显示基于Jinja2模板引擎的页面,供用户注册。

class SignupHandler(webapp.RequestHandler):
    def get(self, *args, **kwargs):
        utils.render_template(self, 'signup.html')

下面的代码是render_template,我创建它作为Jinja2函数的包装器,以便在我的项目中更方便地使用它:

def render_template(response, template_name, vars=dict(), is_string=False):
    template_dirs = [os.path.join(root(), 'templates')]
    logging.info(template_dirs[0])
    env = Environment(loader=FileSystemLoader(template_dirs))
    try:
        template = env.get_template(template_name)
    except TemplateNotFound:
        raise TemplateNotFound(template_name)
    content = template.render(vars)
    if is_string:
        return content
    else:
        response.response.out.write(content)

由于我经常在我的项目中使用此函数render_template并且通常以相同的方式,只是使用不同的模板文件,我想知道是否有办法摆脱不得不像现在这样调用它, self 作为第一个参数,但仍然可以访问该对象。

4 个答案:

答案 0 :(得分:9)

如果你不需要 self,你可以使用staticmethod装饰器来创建一个不接收对象作为其第一个参数的方法:

class Foo(object):
    @staticmethod
    def foo(bar, baz, qux):
        pass

相反,如果您编写的代码只处理类全局数据,则可以使用类方法:

class Foo(object):
    global_cache={}
    @classmethod
    def set(cls, key, value):
        cls.global_cache[key] = value

相反,如果你正在编写真正需要引用对象实例的代码 - self是该语言的一部分。 Python的一部分是“明确比隐含更好”,而使用self就是一个例子。

答案 1 :(得分:2)

要调用类中存在的函数,但不需要知道任何关于它自身的信息(除去自参数),可以使用staticmethod

这方面的一个例子可能是

class Person:

  @staticmethod
  def barbar(arg1, arg2, arg3):
    # Has no idea of the class or instance in which this was called on.
    pass

要调用此方法,您可以执行以下操作:

Person.barbar("hi","bye","jump")

答案 2 :(得分:1)

你不必编写self,这只是约定,但是当一个对象的方法被调用时,它被作为第一个参数提供给对象,所以你必须给它一个名字。在我手机上开发的严密代码中,我之前使用过s,当与C ++代码接口时,我使用了this,但通常最好使用self


Update0

等等,你没有定义一个对象方法。也许你应该这样,然后你运行object.func(*args, **kwargs)而不是func(object, *args, **kwargs)。我需要看看你想要做什么才能知道什么是合适的。

答案 3 :(得分:1)

看起来您应该创建自己的webapp.RequestHandler子类并在其上定义render_template方法:

class MyRequestHandler(webapp.RequestHandler):
    def render_template(self, template_name, vars=dict(), is_string=False):
        # Body of render_template, with "request" replaced with "self" ...

然后在你的观点中使用它:

class SignupHandler(MyRequestHandler):
    def get(self, *args, **kwargs):
        self.render_template('signup.html')