我有以下课程,我想知道@classmethod
该课程的每个方法的上述内容。
class User(db.Model):
name = db.StringProperty(required = True)
pw_hash = db.StringProperty(required = True)
email = db.StringProperty()
@classmethod
def by_id(cls, uid):
return User.get_by_id(uid, parent = users_key())
@classmethod
def by_name(cls, name):
u = User.all().filter('name =', name).get()
return u
@classmethod
def register(cls, name, pw, email = None):
pw_hash = make_pw_hash(name, pw)
return User(parent = users_key(),
name = name,
pw_hash = pw_hash,
email = email)
@classmethod
def login(cls, name, pw):
u = cls.by_name(name)
if u and valid_pw(name, pw, u.pw_hash):
return u
此类用于为 App Engine 数据存储区创建实体。
@classmethod
,它将接收类作为第一个参数,以防它需要用于某些事情。它通常cls
按约定调用。在这个例子中,所有方法都有它def by_name(cls, name):
。为此,C++ 将重载作为一个函数,但 Python 没有,所以这就是它适用的地方classmethod
。简而言之:当这个方法被调用时,它作为第一个参数而不是那个类的实例被传递给类(就像我们通常对方法所做的那样)。这意味着您可以在该方法中使用该类及其属性,而无需实例化该类。例子:一个实际的例子:
为了完成@eduardo-munizaga的回答,您在这个实体创建中看到的是一种众所周知的单例模式的实现。您无需创建实例,而是直接使用类及其属性和方法。
但它仍然是一个类,因此可以派生出重载属性和方法的子类。具体来说,它
User
派生自db.Model
,它将在其中查找其缺失的属性和方法。例如,当方法register
返回一个实例时User
:这称为实例工厂。如果你正确解析它,你的类
User
没有任何方法__init__
来创建这个实例,所以它会使用继承自db.Model
的方法来完成魔法。