是否可以定义一个函数而不用这种方式引用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 作为第一个参数,但仍然可以访问该对象。
答案 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
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')