在Python中正确使用类常量

时间:2014-03-06 18:07:02

标签: python constants

此问题特别涉及在下面的示例代码中使用类常量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,我应该将这些常量提取到某个地方,还是将常量保留在自己的内部更好类?

是否有更多的Pythonic方法来实现这一点而不是使用这些类常量?

3 个答案:

答案 0 :(得分:5)

看起来你正在使用类作为常量的命名空间。您应该问自己,每个类中的ABOVEBELOW常量是否在彼此之间存在差异。

如果需要区分(不仅仅是数字差异,还有语义),那么将它们存储在它们所代表的类中是最好的方法。另一方面,如果它们在每个类中都具有相同的语义,那么你就不会坚持DRY原则并且你正在复制代码。

解决方案可以在模块级别存储它们,或者只创建一个类来包含常量。

答案 1 :(得分:4)

修改

基于OP的评论,我意识到我忽略了ABOVEBELOW不是真正的参数常量而只是强类型名称(即枚举)的事实。

因此我认为接受的答案是正确答案:)

旧回答:

如果常量的数量很小,它实际上归结为偏好,但是,如果你有很多,按类命名,可能是一个好主意。

另外,你有继承吗?如果是,你是否覆盖子类中的常量值?如果是的话,你显然需要把它们放在课堂里。

另外,my_class.find_thing_in_direction(MyClass.ABOVE, 3)很臭:find_thing_in_direction最有可能直接引用自己的类ABOVE常量。

另外,SomeClass是一个非常糟糕的类名:)

答案 2 :(得分:0)

对于您的具体方法find_thing_in_directiondirection param最好是一个名为bool的{​​{1}}标记,就像内置reverse函数一样作用:

sorted

这样您就不必使用类属性。