【发布时间】:2009-12-11 21:32:35
【问题描述】:
我正在创建一个 Django 应用程序,它在其模型中使用了一些继承,主要是因为我需要为所有内容分配一个 UUID 和一个引用,以便我知道它是什么类。这是基类的简化版本:
class BaseElement(models.Model):
uuid = models.CharField(max_length=64, editable=False, blank=True, default=lambda:unicode(uuid4()))
objmodule = models.CharField(max_length=255, editable=False, blank=False)
objclass = models.CharField(max_length=255, editable=False, blank=False)
class ChildElement(BaseElement):
somefield = models.CharField(max_length=255)
我想确保自动设置 objmodule、objclass 和 uuid。我从this post 了解到,通过编写自己的构造函数来做到这一点是个坏主意,而且我最好编写一个工厂函数。所以现在我的 BaseElement 和 ChildElement 看起来像这样:
class BaseElement(models.Model):
uuid = models.CharField(max_length=64, editable=False, blank=True, default=lambda:unicode(uuid4()))
objmodule = models.CharField(max_length=255, editable=False, blank=False)
objclass = models.CharField(max_length=255, editable=False, blank=False)
def set_defaults(self):
self.objmodule = unicode(self.__class__.__module__)
self.objclass = unicode(self.__class__.__name__)
self.uuid = unicode(uuid4())
class ChildElement(BaseElement):
somefield = models.CharField(max_length=255)
@staticmethod
def create(*args, **kwargs):
ce = ChildElement(*args, **kwargs)
ce.set_defaults()
return ce
这行得通。我可以调用ChildElement.create(somefield="foo"),我会得到一个适当的对象,其中uuid、objmodule 和objclass 字段设置正确。然而,当我创建更多类,如ChildElement2 和ChildElement3 时,我发现我正在插入完全相同的静态工厂函数。这让我很恼火,因为代码重复很糟糕。
使用普通方法,我只需在 BaseElement 中插入 create 工厂函数,但是,我不能在此处执行此操作,因为我没有 self 句柄(因为它尚未创建) 以获取有关调用该方法的对象的类的信息。
有没有办法可以将这个工厂迁移到BaseElement 类中,这样我就不必到处复制这段代码并且仍然拥有它,因此它会自动设置uuid、objmodule 和objclass?
【问题讨论】:
标签: python django inheritance