python--enum,,# enum用于枚举


# enum用于枚举,该模块下有一个Enum,我们定义的类要继承它# 一旦继承,那么我们定义的key(仮),不能有重复值。# 如果要保证value(仮)不重复,那就引入unique,给我们定义的类加上这个装饰器from enum import Enum, unique@uniqueclass Color(Enum):    red = 1    green = 2    blue = 3    yellow = 4    pink = 5    cyan = 6# 通过名称获取成员,两种方式print(Color["red"])  # Color.redprint(Color.red)  # Color.red# 通过值来获取成员print(Color(2))  # Color.green# 获取成员的名称和值print(Color.red.name)  # redprint(Color.red.value)  # 1# 也可以通过迭代获取成员for color in Color:    print(color.name, color.value)‘‘‘red 1green 2blue 3yellow 4pink 5cyan 6‘‘‘

  

# 如果不加上unique,也就允许值相同会有什么情况from enum import Enumclass Girls(Enum):    satori = 1    mashiro = 2    nagisa = 3    tomoyo = 4    kurisu = 5    sola = 1# satori 和sola的值都是1print(Girls(1))  # Girls.satori,会发现只打印了satori,也就是第一个。如果值相同,那么后者相当于是前者的别名。# 遍历的话,会发现sola同样没有被打印出来for girl in Girls:    print(girl)‘‘‘Girls.satoriGirls.satoriGirls.mashiroGirls.nagisaGirls.tomoyoGirls.kurisu‘‘‘# 如果想获取所有的成员,哪怕值相同,该怎么做呢?# 枚举属性内部有一个__members__属性,相当于一个字典for girl in Girls.__members__.items():    print(girl)‘‘‘(‘satori‘, <Girls.satori: 1>)(‘mashiro‘, <Girls.mashiro: 2>)(‘nagisa‘, <Girls.nagisa: 3>)(‘tomoyo‘, <Girls.tomoyo: 4>)(‘kurisu‘, <Girls.kurisu: 5>)(‘sola‘, <Girls.satori: 1>)‘‘‘# 会发现以一种更详细的方式打印了出来# 并且每个元组的第二个元素是<enum ‘Girls‘>类型# 不要被<>给忽悠了,其实就是我们用Girls.satori,Girls.mashiro ····获取得到的结果for girl in Girls.__members__.items():    print(girl[1].name, girl[1].value)‘‘‘satori 1mashiro 2nagisa 3tomoyo 4kurisu 5satori 1‘‘‘# 成员之间也可以进行比较,但只能用==,is等操作符,不支持大小比较print(Girls.satori is Girls.mashiro)  # Falseprint(Girls.satori == Girls.mashiro)  # Falseprint(Girls.satori is Girls.sola)  # True,因为两者值一样,后者是前者的别名,两个指针指向了同一个地方print(Girls.satori is Girls.sola)  # True# 如果把1换成列表的话class Girls(Enum):    satori = [1, 2]    mashiro = 2    nagisa = 3    tomoyo = 4    kurisu = 5    sola = [1, 2]    kurumi = [1, 2]print(Girls.satori is Girls.sola)  # Trueprint(Girls.satori is Girls.sola)  # Trueprint(Girls.kurumi is Girls.sola)  # True# 会发现仍旧是True,尽管列表是可变类型,但如果值一样,会继续让sola的指针指向satori的指针所指向的内存# 因为值一样,那么sola就看做是satori的引用# 同理再加上一个kurumi是一样的结果# 不用__members__的话,打印的仍然是第一个satori

  

python--enum

评论关闭