我发现了这段代码实例化了一个带有对象的类
但即使没有定义__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
答案 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)