2013-04-30 13 views
7

私は "enum class"をPythonで記述しようとしています。私が現在経験しているわずかな迷惑は、enumクラス内でenum値を定義できないことです。Python 2.x - 同じクラスのクラスの静的インスタンスを作成する

class Fruit: 
    def __init__(self, name): 
     self.name = name 

class Fruits(Enum): 
    Apple = Fruit("apple") 

しかし、私はこれをしたい、または同様に読みやすいと同等になります:それは私がこれを行うことができ、ある

class Fruit(Enum): 
    def __init__(self, name): 
     self.name = name 

    Apple = Fruit("apple") 

残念ながら、私は次のエラーを取得しています: 名「果実」定義されていません

このような場合の可視性のルールは何ですか?私を助けることができる、ほとんど知られていないPythonのトリックはありますか?私はEnumのメタクラスで書くことが可能なものを好むでしょう。それはユーザーの使い方をあまり煩雑にしてしまうからです。

+1

は、列挙型のメタクラスは、表示されません。 – Liosan

+0

これは、 'class'がブロックの最後に達するまで定義されていないためです。 – jamylak

+1

クラス定義の後に、インスタンスを作成してaという名前で保存するために' Fruit.Apple = Fruit( "apple") 'クラス属性。 – martineau

答えて

1

あなたはこのような単純な何かをしたメタクラスを作ることができる:

class MetaEnum(type): 
    def __new__(cls, class_name, parents, attrs): 
     def __init__(self, name=None): 
      if name is not None: self.name = name 
     attrs['__init__'] = __init__ 
     Klass = type.__new__(cls, class_name, parents, attrs) 
     if 'instances' in attrs: 
      for name in attrs['instances']: 
       setattr(Klass, name.capitalize(), Klass(name)) 
      del Klass.instances # clean up 
     return Klass 

class Fruit(object): 
    __metaclass__ = MetaEnum 
    instances = ('apple', 'banana', 'cranberry') 

for attr_name in dir(Fruit): 
    if not attr_name.startswith('_'): 
     attr = getattr(Fruit, attr_name) 
     if type(attr) is Fruit: 
      print('Fruit.{}, is a Fruit named {}'.format(attr_name, getattr(attr, 'name'))) 
     else: 
      print('Fruit.{}, is a {}'.format(attr, type(attr))) 

出力:私はそれはかなり無関係だと思うので、

Fruit.Apple, is a Fruit named apple 
Fruit.Banana, is a Fruit named banana 
Fruit.Cranberry, is a Fruit named cranberry 
+0

それを正しく読めば、それは私が望んだことをする。私はこのルートについて考えなかった。文法を残念に思って、私はそれをちょっと試してみる...確かに+1。 – Liosan

+0

インスタンスが必要ですか? [OK]をクリックして更新された質問への私の更新答えを参照してください。 – martineau

+0

Re:構文では、グローバルモジュールレベルで '__metaclass__ = MetaEnum'を定義すると、デフォルトになり、それに続くクラス定義(それ自身を指定していない)に適用されます。 – martineau