我知道__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这样的大型框架,它不那么易读或易于扩展。
问题内容: 我希望有人能够回答这个对Python有深刻理解的问题 考虑以下代码: 注意)如何不会产生的预期结果?我想知道为什么会这样,是否有办法实现这一目标… 相比之下,下面的示例仍然有效(也许是因为我们不打算重写特殊方法吗?): 问题答案: 不会调用特殊方法,那些__在实例上带有名称包围的特殊方法,而仅在类上,显然可以提高性能。因此,无法直接在实例上进行覆盖并使其起作用。相反,你需要执行以下操作
" My specialty is being right when other people are wrong. " — George Bernard Shaw 深入 在本书其它几处,我们已经见识过一些特殊方法——即在使用某些语法时 Python 所调用的“神奇”方法。使用特殊方法,类用起来如同序列、字典、函数、迭代器,或甚至像个数字!本附录为我们已经见过特殊方法提供了参考,并对一些更加深奥的
在NSIS里面,一些符号被NSIS定义成了特殊的表达符号。例如“$”,被定义为变量的起始符。 这个时候,如果程序需要使用和输出这些符号该怎么办呢?比如输出下面这句话:美元的符号是$,人民币的符号是¥。 如果直接使用: messagebox mb_ok "美元的符号是$,人民币的符号是¥。" 得到的结果是: 美元的符号是,人民币的符号是¥。 而"$"却不见了,怎么办?用一个转义符就可以了: mes
本文向大家介绍python中实现定制类的特殊方法总结,包括了python中实现定制类的特殊方法总结的使用技巧和注意事项,需要的朋友参考一下 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()函数。 除此之外,Python的clas
问题内容: 特性已成为PHP5.4的最大新增功能之一。我了解语法并了解特性背后的思想,例如将水平代码重用于日志,安全性,缓存等常见内容。 但是,我仍然不知道如何在项目中利用特质。 是否有任何已经使用了特征的开源项目?关于如何使用特征构造体系结构的任何好的文章/阅读材料? 问题答案: 我个人的观点是,在编写简洁的代码时实际上很少使用特质。 与其使用特征将代码入侵到类中,不如通过构造函数或setter
目录表 特殊的方法 单语句块 列表综合 使用列表综合 在函数中接收元组和列表 lambda形式 使用lambda形式 exec和eval语句 assert语句 repr函数 概括 到目前为止,我们已经学习了绝大多数常用的Python知识。在这一章中,我们将要学习另外一些方面的Python知识,从而使我们对Python的了解更加 完整 。 特殊的方法 在类中有一些特殊的方法具有特殊的意义,比如__i