Как Вы бросаете экземпляр к производному классу?

Эта единственная половина касается Вашего вопроса - но в интересах документации я отправлю его здесь.

А, недавний , CentOS/Perl bugfix увеличил скорость нашего приложения больше, чем вдвое. Это - необходимость для любого рабочий CentOS Perl и использование благословлять/перегружать функции.

11
задан Chris Lieb 13 July 2009 в 16:12
поделиться

4 ответа

Я думаю, вы действительно хотите создать 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 метода класса для создания экземпляров класса, используемого для вызова метода класса.

9
ответ дан 3 December 2019 в 09:20
поделиться

Python - это язык с динамической типизацией, поэтому концепции «приведения» не существует. Если объект уже является UnapprovedUser ,

1
ответ дан 3 December 2019 в 09:20
поделиться

В методе класса класс передается в параметре cls. Поэтому вместо User.something делайте cls.something. Готово!

Тем не менее, я не уверен, что смогу сделать это с двумя типами пользователей. Я не на 100% уверен, что вы имеете в виду под словом «Одобрено», мне кажется, что это одно из двух.

  1. Это может означать, что пользователь еще не вошел в систему. В этом случае у меня был бы специальный экземпляр Anonymous User для не авторизованных пользователей. Поскольку вы перемещаете DN при утверждении, более вероятно, что это именно то, что вы делаете.

  2. Это может означать, что пользователь не был утвержден в качестве полноправного члена или что-то в этом роде. Это всего лишь частный случай обработки разрешений, и вы, вероятно, в конечном итоге захотите получить больше разрешений позже. Вместо этого я бы добавил поддержку предоставления ролей пользователей и создания "

1
ответ дан 3 December 2019 в 09:20
поделиться
  • 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

1
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: