У меня есть следующий класс, и я хотел бы знать, для чего @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 , то, что вы видите в этом создании Entity , является своего рода реализацией известного шаблона Singleton . Вместо создания экземпляров вы напрямую используете класс с его атрибутами и методами.
Но это по-прежнему класс, поэтому можно создавать подклассы, которые перегружают атрибуты и методы. В частности, он
User
происходит отdb.Model
, где он будет искать недостающие атрибуты и методы. Например, когда методregister
возвращает экземплярUser
:Это известно как фабрика экземпляров . Если вы разберете его правильно, ваш класс
User
не будет иметь никакого метода__init__
для создания этого экземпляра, поэтому он будет использовать тот, унаследованный отdb.Model
которого и происходит магия.