执行功能而不向其发送"self"

Ser*_*rov 3 python google-app-engine

是否可以在不参考self这种方式的情况下定义函数?

def myfunc(var_a,var_b)
Run Code Online (Sandbox Code Playgroud)

但是它也可以获取发送者数据,就像我将其定义为:

def myfunc(self, var_a,var_b)
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

以下代码是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)
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*ffy 9

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

class Foo(object):
    @staticmethod
    def foo(bar, baz, qux):
        pass
Run Code Online (Sandbox Code Playgroud)

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

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

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