gpt4 book ai didi

python - Python 和 Django 中的继承和工厂函数

转载 作者:太空狗 更新时间:2023-10-30 00:47:02 30 4
gpt4 key购买 nike

我正在创建一个在其模型中使用一些继承的 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"),我会得到一个带有 uuidobjmodule 的适当对象objclass 字段设置正确。但是,随着我创建更多的类,如 ChildElement2ChildElement3,我发现我正在插入完全相同的静态工厂函数。这让我很生气,因为代码重复很糟糕。

使用常规方法,我只是在 BaseElement 中插入 create 工厂函数,但是,我不能在这里这样做,因为我没有句柄self(因为它尚未创建)以获取有关调用该方法的对象的类的信息。

有没有一种方法可以将这个工厂迁移到 BaseElement 类中,这样我就不必在任何地方都复制这段代码并仍然保留它,因此它会自动设置 uuid 的值objmoduleobjclass?

最佳答案

如果您将 create() 设为 @classmethod 而不是 @staticmethod,您将可以访问类对象,您可以使用而不是按名称引用它:

@classmethod
def create(cls, *args, **kwargs):
obj = cls(*args, **kwargs)
obj.set_defaults()
return obj

现在这是通用的,可以在基类而不是每个子类上进行。

关于python - Python 和 Django 中的继承和工厂函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1891004/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com