0

我在 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,它通常是指用户类。但是 cls 指的是什么?

提前致谢。

4

2 回答 2

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。这只是一个约定,但为了保持一致性,最好遵循它。

于 2013-01-21T06:36:50.697 回答
3

“cls”是用于表示“类”的传统标识符。

@classmethod 装饰器调用该方法,例如。obj.method(arg),向第一个参数(在本例中为 cls)传递一个表示对象类的类对象。

如果没有 @classmethod 装饰器,对象本身将被传递给第一个参数(在本例中为 cls)。

于 2013-01-21T06:40:06.100 回答