我在facebook.py用户文件中看到过这个。
class User(db.Model):
username = db.StringProperty(required=True)
password = db.StringProperty(required=True)
@classmethod
def get_by_email(cls, email):
return cls.query(cls.email == email).get()
cls是什么意思?如果你把self,它通常是指User类。但是cls指的是什么?
提前致谢。
答案 0 :(得分:4)
名称无关紧要,但应用classmethod
装饰器会使方法成为类方法。在这种情况下,第一个参数是一个类,而不是一个实例。
请使用以下代码查看实例,类和静态方法的比较:
>>> class Test(object):
def instance_method(sth, x):
return sth, x
@classmethod
def class_method(sth, x):
return sth, x
@staticmethod
def static_method(x):
return x
>>> a = Test()
>>> a.instance_method('abc')
(<__main__.Test object at 0x0000000002C26D30>, 'abc')
>>> a.class_method('abc')
(<class '__main__.Test'>, 'abc')
>>> a.static_method('abc')
'abc'
按照惯例,当您引用同一个实例时,请将其命名为self
。当您引用其类时,请将其命名为cls
。这只是一个惯例,但最好遵循它以保持一致性。
答案 1 :(得分:3)
“cls”是用于表示“类”的常规标识符。
@classmethod装饰器调用方法,例如。 obj.method(arg)
,传递给第一个参数(在本例中为cls)一个表示对象类的类对象。
如果没有@classmethod装饰器,对象本身将被传递给第一个参数(在本例中为cls)。