【问题标题】:Use main class' properties in subclass?在子类中使用主类的属性?
【发布时间】:2015-06-26 09:35:49
【问题描述】:

样本:

from django.db import models


class BaseModel(models.Model):
    CHOICES = ((0, 'nope'),
               (1, 'yep'),)
    # ...


class P(BaseModel):
    p = models.SmallIntegerField(default=1, choices=BaseModel.CHOICES)

如果我只使用BaseModel.CHOICES,则没有必要继承BaseModel。但我必须继承它,因为其他列。

如何让P继承CHOICES属性而不是使用它父亲的CHOICES

【问题讨论】:

  • 您是否尝试创建函数返回选择值并使用它。 like def get_choice(): return ((0, 'nope'), (1, 'yep'),) 并使用 like p = models.SmallIntegerField(default=1,choices=get_choice)
  • 没有像super() 这样的神奇东西,如果这就是你要问的。这似乎是正确的方法。
  • @giaosudau 我只是想把所有的东西都放在BaseModel 中,让子类看起来足够干净,你的意思是我应该为每个子类写一个get_choice 方法吗?
  • @Sinux 它在一个类之外只是一个静态函数或者只是创建一个常量。
  • @giaosudau 不只是一个CHOICES,那么我需要为BaseModel中的每个属性写一个方法,可能是一个很大的数字

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


【解决方案1】:

在您的示例中,p 不是继承字段,因此它不能“继承”BaseModel 的任何内容。 P(子类)BaseModel 继承 CHOICES,但在定义字段 p 时,P 类尚不存在(它只会在class 语句体的结尾),因此此时您不能引用 P.CHOICES,并且由于名称 CHOICES 未在 P 类语句的主体中定义,因此您也不能引用它。所以基本上你的 sn-p 是简单明了的解决方案。

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多