首页 > 解决方案 > 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__方法,想请你解释一下。

标签: pythondjango

解决方案


这称为运算符重载,在您的示例中,它用于比较两个对象。实现__eq__()方法后,您可以比较任何其他对象与您的对象是否相等。

我们现在可以从您的类中创建两个对象:

obj1 = FileSizeValidator(100)
obj2 = FileSizeValidator(200)

并且可以将它们比较为obj1 == obj2

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

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


推荐阅读