为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉莫斯之舞 2022-01-05 12:16:59
我发现这段代码用一个对象实例化了一个类,但即使没有定义__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))})
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

也许您的问题是在文章中的上述代码之前提出的,但现在的实际代码是

'token':account_activation_token.make_token(user),

这将是该make_token方法的正确调用。使用上面粘贴的代码,调用account_activation_token(user)会引发一个 `TypeError: 'TokenGenerator' object is not callable 错误。


查看完整回答
反对 回复 2022-01-05
?
九州编程

TA贡献1785条经验 获得超4个赞

您可以使用__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)


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信