【问题标题】:Naming constant class attribute in Python在 Python 中命名常量类属性
【发布时间】:2020-08-18 08:27:00
【问题描述】:

我有一个类属性,它在一个类中是常量,但在它的子类或同级类中有一个不同的值。并且该属性是在基类的一个方法中使用的。

在这种情况下,我是否应该将属性address 表示为常量,即像ADDRESS 这样的SCREAMING_SNAKE_CASE?

例如,

class BaseClass:
    address = ''

    @classmethod
    def print_address(cls):
        print(cls.address)

class SubClass1(BaseClass):
    address = 'sub1'

class SubClass2(BaseClass):
    address = 'sub2'        

或者,有没有更好的方法来做同样的事情?

【问题讨论】:

  • 我不确定这种问题是否在stackoverflow中成为主题。如果不合适,请告诉我
  • 如果它在子类中有不同的值,那么cls.address 在编译时没有常量值,所以根据定义,它不是常量。 lower_snake_case 适合 IMO;但我不知道如何对这个问题给出非基于意见的答案。

标签: python constants conventions


【解决方案1】:

常量通常在模块级别定义,并以全部大写字母书写,并用下划线分隔单词。示例包括 MAX_OVERFLOW 和 TOTAL。

所以,如果它是一个类属性,就 PEP-8 而言,它不被视为常量。

但是,现实世界中很少有例外。

Django 模型的常量

在 Django 文档的示例中,choices 字段的常量被封装到模型本身中:

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    GRADUATE = 'GR'
    YEAR_IN_SCHOOL_CHOICES = [
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
        (GRADUATE, 'Graduate'),
    ]
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

来源:Model field reference

枚举

enum.Enum 使用 SCREAMING_SNAKE_CASE 作为枚举值。例如:

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

来源:enum.Enum documentation

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2016-05-21
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多