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