Эта единственная половина касается Вашего вопроса - но в интересах документации я отправлю его здесь.
А, недавний , CentOS/Perl bugfix увеличил скорость нашего приложения больше, чем вдвое. Это - необходимость для любого рабочий CentOS Perl и использование благословлять/перегружать функции.
Я думаю, вы действительно хотите создать UnapprovedUser
, а не User
, а не «кастинг», когда вызываете UnapprovedUser.get ()
. Для этого:
Измените User.get
, чтобы фактически использовать переданный аргумент cls
:
@classmethod
def get(cls, uid):
ldap_data = LdapUtil.get(uid + ',' + self.base_dn)
return cls._from_ldap(ldap_data)
Вам нужно будет сделать что-то подобное в _from_ldap
. Вы не указали код для _from_ldap
, но я предполагаю, что в какой-то момент он делает что-то вроде:
result = User(... blah ...)
Вы хотите заменить это на:
result = cls(... blah ...)
Помните: в Python объект класса - это вызываемый, который создает экземпляры этого класса. Таким образом, вы можете использовать параметр cls
метода класса для создания экземпляров класса, используемого для вызова метода класса.
Python - это язык с динамической типизацией, поэтому концепции «приведения» не существует. Если объект уже является UnapprovedUser
,
В методе класса класс передается в параметре cls. Поэтому вместо User.something делайте cls.something. Готово!
Тем не менее, я не уверен, что смогу сделать это с двумя типами пользователей. Я не на 100% уверен, что вы имеете в виду под словом «Одобрено», мне кажется, что это одно из двух.
Это может означать, что пользователь еще не вошел в систему. В этом случае у меня был бы специальный экземпляр Anonymous User для не авторизованных пользователей. Поскольку вы перемещаете DN при утверждении, более вероятно, что это именно то, что вы делаете.
Это может означать, что пользователь не был утвержден в качестве полноправного члена или что-то в этом роде. Это всего лишь частный случай обработки разрешений, и вы, вероятно, в конечном итоге захотите получить больше разрешений позже. Вместо этого я бы добавил поддержку предоставления ролей пользователей и создания "
super (UnapprovedUser, self) неверен, он должен быть super (UnapprovedUser, cls), потому что в методе класса у вас нет доступа к self
Я повторю ваш вопрос, в базовом классе вы создаете пользователя и каким-то образом хотите вернуть производный класс, например
class User(object):
@classmethod
def get(cls, uid):
return User()
class UnapprovedUser(User):
@classmethod
def get(cls, uid):
user = super(UnapprovedUser, cls).get(uid)
return user # invalid syntax
print UnapprovedUser.get("XXX")
он печатает объект User вместо объекта UnapprovedUser здесь вы хотите, чтобы UnapprovedUser.get возвращал UnapprovedUser, для этого вы можете создать фабричную функцию, которая вернет соответствующего пользователя и затем заполнит ее ldap
class User(object):
@classmethod
def get(cls, uid):
return cls.getMe()
@classmethod
def getMe(cls):
return cls()
class UnapprovedUser(User):
@classmethod
def get(cls, uid):
user = super(UnapprovedUser, cls).get(uid)
return user
print UnapprovedUser.get("XXX")
, она распечатает объект UnapprovedUser