在Python中命名常量类属性

问题描述

我有一个class属性,它在一个类中恒定,但在其子类或同级类中具有不同的值。并且该属性用于基类的方法中。

在这种情况下,我是否应该将属性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'        

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

解决方法

常量通常在模块级别定义,并以所有大写字母书写,并用下划线分隔单词。示例包括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