python - 执行函数而不向其发送 'self'

标签 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 作为第一个参数,但仍然可以访问该对象。

最佳答案

如果您不需要 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 的使用就是一个例子。

关于python - 执行函数而不向其发送 'self',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5313364/

相关文章:

python - 为模块创建新记录器是否仍然使用根记录器名称?

Python - 在使用 raw_input() 时遇到一些问题

python - 通过API进行CDH自动部署不会为主机设置CDH版本

web-services - Google App Engine + 基于 JSON 的服务 + 身份验证

python - 如何在Python中读取脏csv文件?

python - Pybind - 使用指向派生类的共享指针调用函数

java - Google App Engine 和 Java 版本?

android - 使用 Android、App 引擎 + 数据存储存储个人资料图像的最佳方式

google-app-engine - Google App Engine 上的 Cron 作业

python - 应用引擎 : filter for value in list returns empty list