2012-05-20 48 views
66

在python中,我想讓一個類有一些「常量」(實際上是變量),這在所有子類中都是常見的。有沒有辦法用友好的語法來做到這一點? 現在我使用:python中的類常量

class Animal: 
    SIZES=["Huge","Big","Medium","Small"] 

class Horse(Animal): 
    def printSize(self): 
     print(Animal.SIZES[1]) 

,我不知道是否有更好的方式來做到這一點還是有辦法做到這一點無需再爲寫「動物」。大小之前。 謝謝! 編輯:忘記提及那匹馬是從動物繼承而來的。

+9

不是一個完整的答案,但如果'SIZES'永遠不會改變,肯定使用一個元組而不是列表。像這樣'(「巨大」,「大」,「中」,「小」)' – jamylak

+0

看起來像你真的在這裏枚舉 – Eric

回答

12

您可以通過self.SIZES(在實例方法中)或cls.SIZES(在類方法中)獲得SIZES

在任何情況下,您必須明確在哪裏可以找到SIZES。另一種方法是將SIZES放入包含類的模塊中,但是您需要在單個模塊中定義所有類。

+0

馬的確是動物的一個子類。實際上,使用self.SIZES [1]代替Animal.SIZES [1]是完全可能的。 – betabandido

+0

@betabandido:OP糾正了這個問題。將相應地更新答案。 –

6
class Animal: 
    HUGE = "Huge" 
    BIG = "Big" 

class Horse: 
    def printSize(self): 
     print(Animal.HUGE) 
+0

你也可以通過自我訪問,例如。 「self.HUGE」或「self.BIG」。這隻能在課堂內部進行。 – cevaris

82

由於HorseAnimal一個子類,你可以改變

print(Animal.SIZES[1]) 

print(self.SIZES[1]) 

不過,你要記住,SIZES[1]的意思是 「大」,所以也許你可以通過執行以下操作來改善您的代碼:

class Animal: 
    SIZE_HUGE="Huge" 
    SIZE_BIG="Big" 
    SIZE_MEDIUM="Medium" 
    SIZE_SMALL="Small" 

class Horse(Animal): 
    def printSize(self): 
     print(self.SIZE_BIG) 

或者,您可以創建中間類:HugeAnimal,BigAnimal等等。如果每個動物類將包含不同的邏輯,那將是特別有用的。

2

擴展在betabandido的回答,您可以編寫一個函數來注入屬性爲常量到模塊:

def module_register_class_constants(klass, attr_prefix): 
    globals().update(
     (name, getattr(klass, name)) for name in dir(klass) if name.startswith(attr_prefix) 
    ) 

class Animal(object): 
    SIZE_HUGE = "Huge" 
    SIZE_BIG = "Big" 

module_register_class_constants(Animal, "SIZE_") 

class Horse(Animal): 
    def printSize(self): 
     print SIZE_BIG 
+0

'print SIZE_BIG' out of class will be the same?它是可編輯的嗎?Animal.SIZE_HUGE ='Small''? – Crusader