Python中类常量的正确使用

9 投票
3 回答
8668 浏览
提问于 2025-04-17 21:10

这个问题主要是关于下面示例代码中使用的类常量 ABOVEBELOW

我有几个不同的类,分布在不同的模块中,结构大致是这样的:

class MyClass(object):
    ABOVE = 1
    BELOW = 0

    def __init__(self):
        self.my_numbers = [1,2,3,4,5]

    def find_thing_in_direction(self, direction, cutoff):
        if direction == self.ABOVE:
            return [n for n in self.my_numbers if n > cutoff]
        else:
            return [n for n in self.my_numbers if n < cutoff]


my_class = MyClass()
my_var = my_class.find_thing_in_direction(MyClass.ABOVE, 3)

如果我有一些类分散在不同的模块里,每个类都有自己的 ABOVEBELOW,那么我应该把这些常量提取到一个地方,还是说把常量保留在各自的类里面更好呢?

有没有更符合 Python 风格的方法来处理这些类常量,而不是直接使用它们呢?

3 个回答

0

对于你提到的这个方法 find_thing_in_direction,参数 direction 其实可以改成一个叫 reverse 的布尔值,也就是一个简单的开关,和内置的 sorted 函数做法一样:

def find_thing_in_direction(self, reverse, cutoff):
  if not reverse:
    pass
  else:
    pass

这样的话,你就不需要使用类的属性了。

4

编辑:

根据提问者的评论,我意识到我忽略了一个事实,那就是 ABOVEBELOW 其实并不是参数常量,而只是强类型的名称(也就是一种枚举)。

所以我觉得之前的答案是正确的 :)

旧答案:

如果常量的数量不多,选择哪种方式其实主要看个人喜好。不过,如果常量很多的话,使用类来进行命名空间管理可能是个不错的主意。

另外,你有继承吗?如果有的话,你会在子类中重写常量值吗?如果会,那你显然需要把它们放在你的类里面。

还有,my_class.find_thing_in_direction(MyClass.ABOVE, 3) 这个写法不太好:find_thing_in_direction 应该直接引用它自己类里的 ABOVE 常量。

另外,SomeClass 这个类名也不太好 :)

7

看起来你在用类来当作常量的命名空间。你应该问问自己,ABOVEBELOW 这些常量在每个类里是否有什么不同。

如果需要区分(不仅仅是数字上的不同,还有意义上的不同),那么把它们放在代表它们的类里是最好的方法。反之,如果在每个类里它们的意义都是一样的,那你就没有遵循“不要重复自己”的原则,反而在重复代码。

一个解决方案是把它们放在模块级别,或者单独创建一个类专门用来存放这些常量。

撰写回答