python - Django:我什么时候需要 __eq__ 方法?
问题描述
在 Django 中,我编写了一个自定义的基于类的验证器并实现了该__eq__
方法,因为它也适用于 Django 本身已经实现的验证器。
在这里你可以看到它:
@deconstructible
class FileSizeValidator:
def __init__(self, mb):
self.mb = mb
def __call__(self, value):
limit = self.mb * 1024 * 1024
if value.size > limit:
raise ValidationError('File too big (max. ' + str(self.mb) + ' MiB).')
def __eq__(self, other):
return (
isinstance(other, FileSizeValidator) and
self.mb == other.mb
)
现在,我还为ImageField
. 我想将它用于upload_to=
模型中的参数ImageField
。在这里你可以看到我的例子:
@deconstructible
class RandomFileName:
def __init__(self, directory=''):
self.directory = directory
def __call__(self, instance, filename):
return self.directory + ("/" if self.directory else '') + get_random_string(7) + "." + filename.split('.')[-1]
def __eq__(self, other):
return (
isinstance(other, RandomFileName) and
self.directory == other.directory
)
总的来说,我对它很满意,而且它似乎工作得很好。我只是不知道什么时候需要这个__eq__
方法,想请你解释一下。
解决方案
这称为运算符重载,在您的示例中,它用于比较两个对象。实现__eq__()
方法后,您可以比较任何其他对象与您的对象是否相等。
我们现在可以从您的类中创建两个对象:
obj1 = FileSizeValidator(100)
obj2 = FileSizeValidator(200)
并且可以将它们比较为obj1 == obj2
。
由于我们已经自__eq__()
定义,这将比较class
对象的值和mb
属性的值以返回一个True
或False
值。如果任何一个条件失败,它将返回False
。
默认情况下,在 python 中,两个自定义对象的相等运算符会比较对象的id
值,并且True
除非将对象与自身进行比较,否则永远不会返回。
推荐阅读
- c - 在链表中是否有必要命名所有单个节点?
- php - 如何重复数组一定次数
- elasticsearch - 当 _source.enabled=false 时无法在结果中看到指定的字段
- .net - 让 .NET Framework 项目引用 .NET Standard 程序集需要什么?
- python - 如何使用 pandas iterrows() 获取当前迭代的计数?
- python - 如何从熊猫数据框中的多列中删除字符?
- ruby-on-rails - Twillio 允许听众在会议期间按 * 要求发言
- php - 如何在不破坏的情况下取消设置会话?
- php - 如何修复PHP中文件不上传的问题(上传,但不移动,导致删除)
- go - Fabric SDK 无法初始化加密套件配置