在取其中一个的值时,<form ...>
我发现我可以用这两种方式存储它们,user_post = ...
或者使用self.user_post = ...
,我想知道正确的方法是什么,或者一种和另一种有什么区别,在这两种方式中代码的工作方式对我来说很陌生。
没有self
:
class SignUpHandler(Handler):
def get(self):
self.render('signUp.html')
def post(self):
user_post = self.request.get('username')
passwd_post = self.request.get('password')
与self
:
class SignUpHandler(Handler):
def get(self):
self.render('signUp.html')
def post(self):
self.user_post = self.request.get('username')
self.passwd_post = self.request.get('password')
主要区别在于每个变量的范围。当我们声明一个变量时:
我们指出该变量的范围在 类级别,因此任何实例化该类的对象都可以访问该属性。并且变量number 的值默认为10。
如果我们将变量声明为
变量编号将在声明的方法内有一个范围,因此我们将无法从方法外部访问该变量,我们将收到以下错误:
因此,正确的方法将取决于您应用的编程类型,例如,如果您使用面向对象进行编程,正确的方法是定义类和属性。
我不知道app-engine,但是 python 的工作方式非常清楚:
self
它是对实例的引用,self.user_post
它是它的一个属性,并且user_post
(没有self
)它是一个局部变量。如果将值保存为属性,则可以在使用相同实例的其他方法中使用它。如果您将其与局部变量一起保存,则它仅在声明它的方法内具有作用域。
通常,在示例代码中,它们会放置局部变量来为您提供有关如何使用它们的线索,但这并不意味着它们会影响程序的运行。实际上,如果您从方法中删除所有内容,
post
它应该可以正常工作(例如:def post(self): pass
.您需要使用它的原因
self.
是因为Python不使用@来引用实例属性。在Python中,决定以这样一种方式创建方法,即自动传递方法所属的实例,但不会自动接收:方法的第一个参数是调用方法的实例。这使得方法与函数完全相同,并允许您定义名称(尽管self是惯例,如果您使用不同的东西,人们通常会抱怨。)self对代码来说并不特殊,它只是另一个对象。Python 本可以做更多的事情来区分普通名称和属性(像Ruby那样的特殊语法,或者像C++和Java这样的需要声明,或者可能是其他东西),但它没有。Python 是为了让所有事情都变得明确,让它变得显而易见,虽然它并没有在任何地方完全做到这一点,但它确实可以用于实例属性。因此,当分配给实例属性时,您需要知道将其分配给哪个实例,这就是您需要使用self的原因。
参考。