问题描述
我有一个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,)
枚举
enum.Enum
使用SCREAMING_SNAKE_CASE作为枚举值。例如:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3