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编写了一个自定义类。我想将它用于ImageField模型中的upload_to=参数。在这里你可以看到我的例子:

@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)

并且可以将它们作为CCD_ 7进行比较。

由于我们定义了自定义__eq__(),这将比较对象的classmb属性的值,以返回TrueFalse值。如果任何一个条件失败,它将返回False

在python中,默认情况下,两个自定义对象的相等运算符会比较对象的id值,除非将对象与自身进行比较,否则永远不会返回True

最新更新