小编典典

Python __call__ 特殊方法实战示例

all

我知道__call__当调用类的实例时会触发类中的方法。但是,我不知道什么时候可以使用这种特殊方法,因为可以简单地创建一个新方法并执行方法中完成的相同操作__call__,而不是调用实例,您可以调用方法。

如果有人给我这种特殊方法的实际用法,我将不胜感激。


阅读 1427

收藏
2022-09-02

共1个答案

小编典典

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
这样的大型框架来说,它的可读性或可扩展性都不是那么好。

2022-09-02