我知道__call__调用类的实例时会触发类中的方法。但是,我不知道何时可以使用此特殊方法,因为一个人可以简单地创建一个新方法并执行在__call__方法中完成的相同操作,而无需调用实例,而可以调用该方法。
__call__
如果有人给我这种特殊方法的实际用法,我将不胜感激。
Django表单模块__call__很好地使用了方法来实现用于表单验证的一致API。您可以将自己的表单验证程序编写为Django中的函数。
def custom_validator(value): #your validation logic
Django有一些默认的内置验证器,例如电子邮件验证器,URL验证器等,这些验证器大致属于RegEx验证器。为了清晰地实现这些,Django求助于可调用类(而不是函数)。它在RegexValidator中实现默认的Regex验证逻辑,然后扩展这些类以进行其他验证。
class RegexValidator(object): def __call__(self, value): # validation logic class URLValidator(RegexValidator): def __call__(self, value): super(URLValidator, self).__call__(value) #additional logic class EmailValidator(RegexValidator): # some logic
现在,可以使用相同的语法调用自定义函数和内置的EmailValidator。
for v in [custom_validator, EmailValidator()]: v(value) # <-----
如您所见,Django中的此实现类似于其他人在下面的答案中解释的实现。可以通过其他任何方式实现吗?您可以,但是恕我直言,对于像Django这样的大型框架,它不那么易读或易于扩展。