【问题标题】:How to write a django-like Class ("Models") initialization如何编写类似 django 的类(“模型”)初始化
【发布时间】:2020-02-06 00:35:54
【问题描述】:

我有一个名为“TemporaryPriceReduction”的对象,它告诉我有关正在销售的产品的信息。这个类看起来像这样:

class TPR:
    def __init__(self, product_id, territory):
        self.product_id = product_id
        self.territory = territory

在 django 模型中,它允许您在 init 之外定义事物(至少在继承 models.Model 基类的特定模型中:

class TPR(models.Model):
    product_id = ...
    territory = ...

基本上,我希望能够做到这一点:

class TPR(AbstractClass):
    product_id = product_id
    territory = territory

如何构建类似于抽象基类的东西,以便我可以在 init 之外定义事物(如在 django 中),而不必编写 init?

【问题讨论】:

    标签: python django


    【解决方案1】:

    您所描述的是普通 python 的一个特性,而不是 django。

    当您在__init__ 中分配self.product_id = ... 时,您将在名为product_id 的实例中分配一个属性。

    当您在类主体中分配product_id = ... 时,您将在类中创建一个属性TPR.product_id。你的类的实例不会有这样的属性,除非你明确地分配它们。 Python 属性查找的工作原理是instance.product_id 将在类中找到缺失的属性。这意味着所有未明确覆盖 product_id 的实例,例如在__init__ 中,通过类共享与其product_id 相同的对象。

    关键是你可以使用你想要的语法来定义属性,而不需要对基类做任何特别的事情。

    【讨论】:

    • 我明白了——那么将变量放在实例__init__ 中而不是仅仅放在类级别有什么优点/缺点呢?另外,我认为您忘记完成第二段中的第二句话。
    • @David542 感谢您的关注。我已经通过解释行为差异来描述优点/缺点。你认为什么是优势完全取决于你想要做什么。
    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 2021-02-18
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多