簡體   English   中英

在Python中正確使用類常量

[英]Proper use of class constants in Python

這個問題特別涉及在下面的示例代碼中使用類常量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方法來實現這一點而不是使用這些類常量?

看來你正在使用類作為常量的命名空間。 你應該問問自己,每個班級中的ABOVEBELOW常數是否相互不同。

如果需要區分(不僅僅是數字差異,還有語義),那么將它們存儲在它們所代表的類中是最好的方法。 另一方面,如果他們在每個類中都有相同的語義,那么你就不會堅持DRY原則並且你正在復制代碼。

解決方案可以在模塊級別存儲它們,或者只創建一個類來包含常量。

編輯:

基於OP的評論,我意識到我忽略了ABOVEBELOW不是真正的參數常量而只是強類型名稱(即枚舉)的事實。

所以我認為接受的答案是正確的:)

老答案:

如果常量的數量很小,它實際上歸結為偏好,但是,如果你有很多它們,按類命名,可能是一個好主意。

還有,你有繼承嗎? 如果是,你是否覆蓋子類中的常量值? 如果是的話,你顯然需要將它們保留在課堂內。

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

另外, SomeClass是一個非常糟糕的類名:)

對於你的特定方法find_thing_in_directiondirection參數最好是一個名為reversebool標志,就像內置sorted函數所做的那樣:

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

這樣您就不必使用類屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM