создание экземпляра класса в python как вызываемого объекта

#python #django

#python #django

Вопрос:

Я нашел этот блок кода, который создает экземпляр класса с объектом, но мы использовали его как вызываемый даже без определения __call__ метода. Вот код класса в Django, исходный код на Github, код класса

Вы также можете увидеть создание экземпляра внизу страницы, и здесь мы использовали его, унаследовав от него:

 class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_vlaue(self, user, timestamp):
    return (str(user.pk) str(timestamp) str(user.is_active))

account_activation_token = TokenGenerator()
  

Вот вызов созданного экземпляра в ключе токена словаря:

 message = render_to_string('acc_activate_email.html',
                                    {'user': new_user, 
                                     'domain': current_site.domain,
                                     'uid': urlsafe_base64_encode(force_bytes(new_user.pk),
                                     'token': account_activation_token(new_user))})
  

Вы можете взглянуть на исходный код здесь
исходный код, в котором мы использовали объект

Комментарии:

1. Это все равно приведет к сбою, потому что вы передаете только user , а не timestamp

Ответ №1:

Возможно, ваш вопрос был задан до вышеупомянутого кода из статьи, но фактический код сейчас

 'token':account_activation_token.make_token(user),
  

что было бы правильным вызовом make_token метода. С кодом, который вы вставили выше, вызов account_activation_token(user) вызовет ошибку `TypeError: объект ‘TokenGenerator’ не вызывается.

Комментарии:

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

Ответ №2:

Вы можете сделать это с __call__ методом в классе:

 class TokenGenerator(PasswordResetTokenGenerator):
    def make_token(self, user, timestamp):
        return (str(user.pk) str(timestamp) str(user.is_active))

    def __call__(self, user, password):
        return self.make_token(user, timestamp)


t = TokenGenerator()
t(someuser, sometimestamp)
# some hash
  

Однако я не совсем уверен, что вам это нужно, поскольку у вас есть класс, в котором make_token метод вообще ни на что не ссылается в классе. Функция сделала бы здесь то же самое:

 generate_token(user, timestamp):
    return (str(user.pk) str(timestamp) str(user.is_active))

generate_token(someuser, sometimestamp)
# some hash
  

На самом деле, способ, которым они используют его в документах, заключается в вызове этого метода экземпляра из экземпляра, подобного:

 t = TokenGenerator()

t._make_hash_vlaue(someuser, sometimestamp)
  

Комментарии:

1. я действительно ценю это, я просто хотел узнать, что происходит с кодом, как сказал мне @mcabrams, большое спасибо