我一直在尋找在這個問題的答案: Is it possible to define a class constant inside an Enum?的Python:恆類
最讓我感興趣的是恆類伊桑·弗曼的答案。
class Constant:
def __init__(self, value):
self.value = value
def __get__(self, *args):
return self.value
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.value)
問題是關於Python 3.4,但我使用的是2.7。在回答伊桑設置引力常數作爲類星球,像這樣的實例變量:
G = Constant(6.67300E-11)
我在2.7這個類的測試表明,僅僅鍵入摹給了我這樣的:
Out[49]: Constant(3)
(我將它設置爲3,以便在測試時使用,看起來像__repr__
輸出給我,如果我錯了,請糾正我的錯誤。)
該值可通過G.value。但在Ethan的回答中,他使用
return self.G * self.mass/(self.radius * self.radius)
這顯然只適用於如果返回值與__repr__
輸出。現在,如果我將class Constant:
更改爲class Constant(int):
然後鍵入G我仍然得到__repr__
輸出,但如果我輸入G * 4
我得到12
而不是我得到的錯誤。 (TypeError:不支持的操作數類型爲*:'instance'和'int' )
很明顯,像int對象這樣的東西在調用時可以輸出一個數字。是否有一種我錯過的神奇方法可以讓我爲Constant類做到這一點?由於常量可以是字符串,整數或浮點數,所以我希望有1個類可以處理它們,而3個類可以擴展這些對象。
該值也可以通過G.value設置。我可以鎖定這個常量類的行爲是否像一個實際的常量? (我懷疑答案是否定的。)
爲什麼你希望它是恆定的? – Veedrac 2014-09-27 05:48:39
@Veedrac爲什麼我不想要常量?或者只讀取一個班級中的值?從我對Python的閱讀中,我瞭解到它與Python的「我們都是自願的成年人」哲學背道而馳。我到目前爲止真的很喜歡Python,但我認爲哲學是一個疏忽。我爲我,我自己和我編程 - 沒有人會閱讀它或者很有可能使用它。在過去的15年裏用幾種語言編寫代碼後,我學到了一些東西。其中一件事就是我可以通過簡單地設計一個類,在那個類的內部之外不能改變某些東西,從而防止幾天的調試。 – 2014-09-27 14:24:38
我更想知道你需要什麼水平才能保持不變;我的觀點是檢查是否「通過公共接口不變」,這是這樣做的正確方法是確定了,或者你確實希望它是*完全*不變,這是不可能的。 – Veedrac 2014-09-27 14:29:02