我可以在Python中调用我的基类的赋值运算符吗?

时间:2014-07-24 17:11:30

标签: python django inheritance python-3.x django-models

Django' ImageField允许我使用正常分配在其中存储文件对象。

from urllib import request
from django.db import models
from django.core.files.base import ContentFile

class Customer(models.Model):
    logo = models.ImageField()

customer.logo = ContentFile(request.urlopen(url), 'image.png')

现在我想从ImageField继承自定义字段类型。它将URL作为普通字符串而不是文件对象进行分配。在内部,它应该获取图像并将其分配给它的基类,就像上面的手动示例一样。

from django.db import models

class UrlImageField(models.ImageField):
    def __set__(self, instance, value):
        super() = ContentFile(urllib.request.urlopen(value), 'image.png')

因此,我需要在ImageField基类上调用赋值运算符。我怎么能用Python做到这一点?

2 个答案:

答案 0 :(得分:2)

赋值运算符不能重载。

答案 1 :(得分:1)

您不希望(和不能)重载分配,但您只想扩展ImageField描述符。 描述符在Descriptor HowTo Guide中进行了深入解释。您还应该看一下:Understanding __get__ and __set__ and Python descriptors

要点是他们定义了控制属性访问__set____get__方法。这些方法只是常规方法,因此您必须完全按照常规方法扩展它们:

from django.db import models

class UrlImageField(models.ImageField):
    def __set__(self, instance, value):
        super().__set__(instance, ContentFile(urllib.request.urlopen(value), 'image.png'))