[英]Proper use of class constants in 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
,我應該將這些常量提取到某個地方,還是將常量保存在自己的類中更好?
是否有更多的Pythonic方法來實現這一點而不是使用這些類常量?
看來你正在使用類作為常量的命名空間。 你應該問問自己,每個班級中的ABOVE
和BELOW
常數是否相互不同。
如果需要區分(不僅僅是數字差異,還有語義),那么將它們存儲在它們所代表的類中是最好的方法。 另一方面,如果他們在每個類中都有相同的語義,那么你就不會堅持DRY原則並且你正在復制代碼。
解決方案可以在模塊級別存儲它們,或者只創建一個類來包含常量。
編輯:
基於OP的評論,我意識到我忽略了ABOVE
和BELOW
不是真正的參數常量而只是強類型名稱(即枚舉)的事實。
所以我認為接受的答案是正確的:)
老答案:
如果常量的數量很小,它實際上歸結為偏好,但是,如果你有很多它們,按類命名,可能是一個好主意。
還有,你有繼承嗎? 如果是,你是否覆蓋子類中的常量值? 如果是的話,你顯然需要將它們保留在課堂內。
另外, my_class.find_thing_in_direction(MyClass.ABOVE, 3)
很臭: find_thing_in_direction
應該最有可能直接引用它自己的類' ABOVE
常量。
另外, SomeClass
是一個非常糟糕的類名:)
對於你的特定方法find_thing_in_direction
, direction
參數最好是一個名為reverse
的bool
標志,就像內置sorted
函數所做的那樣:
def find_thing_in_direction(self, reverse, cutoff):
if not reverse:
pass
else:
pass
這樣您就不必使用類屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.