标签:rom from 结果 false enum 通过 val class print
# enum用于枚举,该模块下有一个Enum,我们定义的类要继承它
# 一旦继承,那么我们定义的key(仮),不能有重复值。
# 如果要保证value(仮)不重复,那就引入unique,给我们定义的类加上这个装饰器
from enum import Enum, unique
@unique
class Color(Enum):
red = 1
green = 2
blue = 3
yellow = 4
pink = 5
cyan = 6
# 通过名称获取成员,两种方式
print(Color["red"]) # Color.red
print(Color.red) # Color.red
# 通过值来获取成员
print(Color(2)) # Color.green
# 获取成员的名称和值
print(Color.red.name) # red
print(Color.red.value) # 1
# 也可以通过迭代获取成员
for color in Color:
print(color.name, color.value)
‘‘‘
red 1
green 2
blue 3
yellow 4
pink 5
cyan 6
‘‘‘
# 如果不加上unique,也就允许值相同会有什么情况
from enum import Enum
class Girls(Enum):
satori = 1
mashiro = 2
nagisa = 3
tomoyo = 4
kurisu = 5
sola = 1
# satori 和sola的值都是1
print(Girls(1)) # Girls.satori,会发现只打印了satori,也就是第一个。如果值相同,那么后者相当于是前者的别名。
# 遍历的话,会发现sola同样没有被打印出来
for girl in Girls:
print(girl)
‘‘‘
Girls.satori
Girls.satori
Girls.mashiro
Girls.nagisa
Girls.tomoyo
Girls.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 1
mashiro 2
nagisa 3
tomoyo 4
kurisu 5
satori 1
‘‘‘
# 成员之间也可以进行比较,但只能用==,is等操作符,不支持大小比较
print(Girls.satori is Girls.mashiro) # False
print(Girls.satori == Girls.mashiro) # False
print(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) # True
print(Girls.satori is Girls.sola) # True
print(Girls.kurumi is Girls.sola) # True
# 会发现仍旧是True,尽管列表是可变类型,但如果值一样,会继续让sola的指针指向satori的指针所指向的内存
# 因为值一样,那么sola就看做是satori的引用
# 同理再加上一个kurumi是一样的结果
# 不用__members__的话,打印的仍然是第一个satori
标签:rom from 结果 false enum 通过 val class print
原文地址:https://www.cnblogs.com/traditional/p/9356277.html