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作为第一个参数但是仍然可以访问该对象.
如果您不需要 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就是一个例子.