Python——枚举类和元类

水深无声 2021-11-02 15:24 530阅读 0赞

一、使用枚举类

枚举

Python提供了Enum类来实现:

  1. from enum import Enum

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

这样我们就获得了Month类型的枚举类,可以直接使用Month.Jan来引用一个常量,或者枚举它的所有成员:

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

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

可以对照着看一下输出结果:

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

自定义枚举类:

  1. from enum import Enum, unique
  2. @unique
  3. class Weekday(Enum):
  4. Sun = 0 # Sun的value被设定为0
  5. Mon = 1
  6. Tue = 2
  7. Wed = 3
  8. Thu = 4
  9. Fri = 5
  10. Sat = 6

@unique装饰器可以帮助我们检查保证没有重复值。

访问这些枚举类型可以有若干种方法:

  1. >>> day1 = Weekday.Mon
  2. >>> print(day1)
  3. Weekday.Mon
  4. >>> print(Weekday.Tue)
  5. Weekday.Tue
  6. >>> print(Weekday['Tue'])
  7. Weekday.Tue
  8. >>> print(Weekday.Tue.value)
  9. 2
  10. >>> print(day1 == Weekday.Mon)
  11. True
  12. >>> print(day1 == Weekday.Tue)
  13. False
  14. >>> print(Weekday(1))
  15. Weekday.Mon
  16. >>> print(day1 == Weekday(1))
  17. True
  18. >>> Weekday(7)
  19. Traceback (most recent call last):
  20. ...
  21. ValueError: 7 is not a valid Weekday
  22. >>> for name, member in Weekday.__members__.items():
  23. print(name, '=>', member)
  24. Sun => Weekday.Sun
  25. Mon => Weekday.Mon
  26. Tue => Weekday.Tue
  27. Wed => Weekday.Wed
  28. Thu => Weekday.Thu
  29. Fri => Weekday.Fri
  30. Sat => Weekday.Sat

可见,既可以用成员名称引用枚举常量,又可以直接根据value的值获得枚举常量。

二、元类(metaclass)

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

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

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

所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。

(待补)

其它博客链接:

  1. 变量和数据类型
  2. list和tuple
  3. 条件语句和循环
  4. dict和set
  5. 函数
  6. 切片+迭代+生成器
  7. 生成器和迭代器
  8. 函数式编程
  9. 模块
  10. 面向对象编程
  11. 面向对象高级编程
  12. 定制类
  13. 枚举类和元类
  14. 错误及处理

发表评论

表情:
评论列表 (有 0 条评论,530人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    一、简介             枚举类,写起来代码比较优雅,一个对象的所有的状态值和状态名称都在一个枚举类中,方便维护。另外可以有一些特殊用法,如接口枚举集合(适用于枚