将python中的类实例化为可调用对象

我发现这段代码用一个对象实例化了一个类,但即使没有定义__call__方法,我们也将它用作可调用对象。这里是类的Github代码上Django源码 中类的代码


您也可以在页面底部看到实例化,在这里我们使用它通过继承它来使用它:


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))})


拉莫斯之舞
浏览 161回答 2
2回答

忽然笑

也许您的问题是在文章中的上述代码之前提出的,但现在的实际代码是'token':account_activation_token.make_token(user),这将是该make_token方法的正确调用。使用上面粘贴的代码,调用account_activation_token(user)会引发一个 `TypeError: 'TokenGenerator' object is not callable 错误。

九州编程

您可以使用__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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python