此问题特别涉及在下面的示例代码中使用类常量ABOVE
和BELOW
。
我在不同模块中有几个不同的类,如下所示:
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)
如果我有一些分散在不同模块中的类,每个模块都有自己的ABOVE
和BELOW
,我应该将这些常量提取到某个地方,还是将常量保留在自己的内部更好类?
是否有更多的Pythonic方法来实现这一点而不是使用这些类常量?
答案 0 :(得分:5)
看起来你正在使用类作为常量的命名空间。您应该问自己,每个类中的ABOVE
和BELOW
常量是否在彼此之间存在差异。
如果需要区分(不仅仅是数字差异,还有语义),那么将它们存储在它们所代表的类中是最好的方法。另一方面,如果它们在每个类中都具有相同的语义,那么你就不会坚持DRY原则并且你正在复制代码。
解决方案可以在模块级别存储它们,或者只创建一个类来包含常量。
答案 1 :(得分:4)
修改强>
基于OP的评论,我意识到我忽略了ABOVE
和BELOW
不是真正的参数常量而只是强类型名称(即枚举)的事实。
因此我认为接受的答案是正确答案:)
旧回答:
如果常量的数量很小,它实际上归结为偏好,但是,如果你有很多,按类命名,可能是一个好主意。
另外,你有继承吗?如果是,你是否覆盖子类中的常量值?如果是的话,你显然需要把它们放在课堂里。
另外,my_class.find_thing_in_direction(MyClass.ABOVE, 3)
很臭:find_thing_in_direction
最有可能直接引用自己的类ABOVE
常量。
另外,SomeClass
是一个非常糟糕的类名:)
答案 2 :(得分:0)
对于您的具体方法find_thing_in_direction
,direction
param最好是一个名为bool
的{{1}}标记,就像内置reverse
函数一样作用:
sorted
这样您就不必使用类属性。