python列挙クラス(enum)

5170 ワード

Python enum(列挙)、type()

#     Enum
from enum import Enum

Month = Enum('Month',('Jan','Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

for name,member in Month.__members__.items():
    # value           int  ,   1    
    print(name,'=>',member,',',member.value) 

#     
# Jan => Month.Jan , 1
# Feb => Month.Feb , 2
# Mar => Month.Mar , 3
# Apr => Month.Apr , 4
# May => Month.May , 5
# Jun => Month.Jun , 6
# Jul => Month.Jul , 7
# Aug => Month.Aug , 8
# Sep => Month.Sep , 9
# Oct => Month.Oct , 10
# Nov => Month.Nov , 11
# Dec => Month.Dec , 12

#               ,   Enum       
from enum import Enum,unique

@unique
class WeekDay(Enum):
    Sun = 0 #  sun  value 0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6
    # Sat = 6 #         TypeError: Attempted to reuse key: 'Sat'
    # @unique                  

#                 :
day1 = WeekDay.Mon
print(day1) # WeekDay.Mon

print(WeekDay.Thu) # WeekDay.Thu

print(WeekDay['Tue']) # WeekDay.Tue

print(WeekDay.Tue.value) # 2

print(day1 == WeekDay.Mon) # True

print(day1 == WeekDay.Sun) # False

print(WeekDay(1)) # WeekDay.Mon

print(day1 == WeekDay(1)) # True

print(Weekday(7)) # NameError: name 'Weekday' is not defined

python type()動的作成クラス
type()関数は、タイプまたは変数のタイプを表示できます.Helloはclassであり、そのタイプはtypeであり、hはインスタンスであり、そのタイプはclass Helloです.
classの定義は実行時に動的に作成され、classを作成する方法はtype()関数を使用することです.
type()関数は、オブジェクトのタイプを返したり、新しいタイプを作成したりできます.たとえば、class Hello(object)...の定義を必要とせずにtype()関数でHelloクラスを作成できます.
def fn(self,name='world'):
    print('hello,%s.' % name)
Hello = type('Hello',(object,),dict(hello=fn))
h = Hello()

h.hello() # hello world.

h.hello('py') # hello py.

print(type(Hello)) # 

print(type(h)) # 

classオブジェクトを作成するには、type()関数から3つのパラメータが順次入力されます.
classの名前;継承された親の集合は、Pythonが多重継承をサポートしていることに注意してください.親が1つしかない場合は、tupleの単一要素の書き方を忘れないでください.classのメソッド名は関数にバインドされ、ここでは関数fnをメソッド名helloにバインドします.type()関数で作成されたクラスは、直接classと同じです.Python解釈器がclass定義に遭遇した場合、class定義の構文をスキャンし、type()関数を呼び出してclassを作成するだけです.
通常class Xxx...でクラスを定義しますが、type()関数ではクラスを動的に作成できます.つまり、動的言語自体がランタイム動的にクラスを作成することをサポートします.これは静的言語とは非常に異なり、静的言語ランタイムでクラスを作成するには、ソースコード文字列を構築してコンパイラを呼び出す必要があります.あるいは、いくつかのツールを使用してバイトコードを生成して実装すると、本質的に動的にコンパイルされ、非常に複雑になります.