2017-04-20 9 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 

おそらく超簡単に、しかしに応じて、私に結果を与え、そのようなメンバ関数を記述するための正しい方法は何ですか"enum constant"メソッドを呼び出す?

答えて

3

道からそれを得るために、まず:self.nameは、すでに鍵となりそう

def as_key(self): 
    return self.name 

しかし、私は、これはあなたが望んだものではないと仮定 - その関数はおそらく基本的な例だった、とあなたがしたいです列挙型に基づいて異なることをするより複雑な関数を記述します。

Enum値はsingletonishある - それはまだだ場合、最適化としてリテラルは常に同じオブジェクトを返しますけれども - 新しいオブジェクトを毎回作成することができ、文字列"A"、とは対照的に、AType.Aは常に(正確に同じオブジェクトを返します。メモリ)。

また、このメソッド内では、selfが実際の列挙型オブジェクト - AType.AまたはAType.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,) 

:Pythonでisオペレータは、Javaで==と等価である - それは、正確なオブジェクトのアイデンティティをチェックする(それは同じで、同じオブジェクトだとメモリに置く)。 Pythonの==演算子は、Javaのequals()メソッドと同等です。オブジェクトの値を比較するようにカスタマイズすることができます。

+0

あなたの答えを受け入れると、私は40000の担当者にヒットしました。意味:upvote宝くじで勝った;-) – GhostCat