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

时间:2019-04-09 19:47:22

标签: python django

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

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

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

您可以在此处查看原始代码 original code where we used the object

2 个答案:

答案 0 :(得分:1)

也许您的问题是在本文前面提到的代码之前提出的,但现在的实际代码是

'token':account_activation_token.make_token(user),

这将是对make_token方法的正确调用。使用上面粘贴的代码,调用account_activation_token(user)会引发`TypeError:'TokenGenerator'对象不是可调用错误。

答案 1 :(得分:0)

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