python枚举类元类

作者 新城 日期 2017-08-27
python枚举类元类

使用枚举类

一般情况,我们定义一些全结局常量的时候,习惯使用大写字母来定义如下

1
2
3
JAN = 1
FEB = 2
MAR = 3

处是简单,缺点是类型是int,并且仍然是变量。
更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python提供了Enum类来实现这个功能

1
2
3
4
5
6
7
8
from enum import Enum       #导入枚举类

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

Month.Jan 常量的引用

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

value属性则是自动赋给成员的int常量,默认从1开始计数

1
2
3
4
5
6
7
8
9
10
11
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

访问枚举类的方法

  • day1 = weekday.Mon print(day1)
  • print (Weekday[‘Tue’]) # Weekday.Tue
  • print(Weekday.Tue.value) # 2

    小结:

    Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较

使用元类

动态语言和静态语言最大的区别就是函数和类的的定义,静态语言是运行时动态创建的,动态语言是编译时定义的。

1
2
3
4
5
6
7
8
9
10
class Hello(object):
def hello(self, name='world'):
print('Hello, %s.' % name)

from hello import Hello
h = Hello()
h.hello()

print(type(Hello)) #<class 'type'>
print(type(h.hello())) #<class 'hello.Hello'>

metaclass (很少用 待)

除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass。

metaclass,直译为元类,简单的解释就是:

**当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。

但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。

连接起来就是:先定义metaclass,就可以创建类,最后创建实例。**