2017-04-20 83 views
0

看到這個代碼:如何爲枚舉編寫「正確」的成員函數?

from __future__ import print_function 
from enum import Enum 

class AType(Enum): 
    A = 1 
    B = 2 

    def as_key(self): 
     if self.name == AType.A: 
      return 'key for As' 
     else: 
      return 'some other key' 

print(AType.A.as_key()) 
print(AType.B.as_key()) 

從Java陣營;我本來期望它打印

key for As 
some other key 

,但我得到:

some other key 
some other key 

可能超簡單,但什麼是寫一個這樣的成員函數的正確方法,讓我依賴於結果「枚舉常量」我調用的方法?

回答

3

首先,把它弄出來的方法:self.name已經是關鍵,所以

def as_key(self): 
    return self.name 

但我想這是不是你想要的 - 該功能可能只是一個簡單的例子,你想編寫更復雜的函數,根據枚舉完成不同的事情。

Enum值singletonish - AType.A總是會返回完全相同的對象(而不是字符串"A",可每次都創建一個新的對象 - 儘管作爲一個優化的文字總是會返回相同的對象,如果它仍然在記憶)。

此外,在該方法中,self是實際的枚舉對象 - AType.AAType.B

所以 - 只是比較self到枚舉值:

def as_key(self): 
    if self is AType.A: 
     return 'A' 
    elif self is AType.B: 
     return 'B' 
    else: 
     assert False, 'Unknown AType %s' % (self,) 

BTW:在is運營商在Python等同於Java的== - 它會檢查確切的對象標識(這是同一個對象在同一放在記憶中)。 Python的==運算符等同於Java的equals()方法 - 可以對其進行自定義以比較對象的值。

+0

接受你的答案讓我打了40000代表。含義:你在upvote抽獎中獲勝;-) – GhostCat