【问题标题】:Why named arguments for django model classes为什么为 django 模型类命名参数
【发布时间】:2016-11-21 06:43:49
【问题描述】:

我想知道为什么我们要为模型类的参数指定名称,例如 django 中的CharField。例如这样。

first_name = models.CharField(max_length=40, blank=True)

为什么不

first_name = models.CharField(40, True)

在java中我们这样调用new charField(40,true)。如果它们是默认参数,我们在构造函数的定义中指定它们(在java中)。

我们为什么要写在这里。请解释一下。

【问题讨论】:

  • 特别是,Python 不像 Java 那样具有方法重载,因此您不能拥有具有不同参数的同一方法的多个版本。由于max_lengthblank 不是前两个位置参数,因此您必须使用models.CharField(None, None, False, 40, False, True),必须显式匹配前面位置参数的每个默认值。您可以看到为什么首选关键字参数。

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


【解决方案1】:

您在 java 中看到的称为positional arguments,其中参数始终按特定顺序排列。然而,Python 支持两种类型的参数:positional arguments and keyword arguments

关键字参数的美妙之处在于,在使用函数时,您不必担心为方法(或类构造函数)中使用的所有参数定义值。

您可以只使用identifier,例如在你的情况下 max_lengthblank 并保留其余的参数。

如果您查看Field 类(CharField 的超类)的__init__ 方法,您会发现其中定义了许多关键字参数:

def __init__(self, verbose_name=None, name=None, primary_key=False,
        max_length=None, unique=False, blank=False, null=False,
        db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
        serialize=True, unique_for_date=None, unique_for_month=None,
        unique_for_year=None, choices=None, help_text='', db_column=None,
        db_tablespace=None, auto_created=False, validators=[],
        error_messages=None):

其中,您刚刚定义了max_lengthblank,因为这是您需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2012-02-08
    • 2015-05-13
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多