Python中类常量的正确使用
这个问题主要是关于下面示例代码中使用的类常量 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
,那么我应该把这些常量提取到一个地方,还是说把常量保留在各自的类里面更好呢?
有没有更符合 Python 风格的方法来处理这些类常量,而不是直接使用它们呢?
3 个回答
对于你提到的这个方法 find_thing_in_direction
,参数 direction
其实可以改成一个叫 reverse
的布尔值,也就是一个简单的开关,和内置的 sorted
函数做法一样:
def find_thing_in_direction(self, reverse, cutoff):
if not reverse:
pass
else:
pass
这样的话,你就不需要使用类的属性了。
编辑:
根据提问者的评论,我意识到我忽略了一个事实,那就是 ABOVE
和 BELOW
其实并不是参数常量,而只是强类型的名称(也就是一种枚举)。
所以我觉得之前的答案是正确的 :)
旧答案:
如果常量的数量不多,选择哪种方式其实主要看个人喜好。不过,如果常量很多的话,使用类来进行命名空间管理可能是个不错的主意。
另外,你有继承吗?如果有的话,你会在子类中重写常量值吗?如果会,那你显然需要把它们放在你的类里面。
还有,my_class.find_thing_in_direction(MyClass.ABOVE, 3)
这个写法不太好:find_thing_in_direction
应该直接引用它自己类里的 ABOVE
常量。
另外,SomeClass
这个类名也不太好 :)
看起来你在用类来当作常量的命名空间。你应该问问自己,ABOVE
和 BELOW
这些常量在每个类里是否有什么不同。
如果需要区分(不仅仅是数字上的不同,还有意义上的不同),那么把它们放在代表它们的类里是最好的方法。反之,如果在每个类里它们的意义都是一样的,那你就没有遵循“不要重复自己”的原则,反而在重复代码。
一个解决方案是把它们放在模块级别,或者单独创建一个类专门用来存放这些常量。