Discuss / Python / 更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。

更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。

Topic source

谁真正理解了这句话的意思???

每个常量是指1,2,3,……12???

from enum import Enum

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

Month.members mappingproxy(OrderedDict([('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,Month,Jan这三者之间的逻辑关系???

孙_师_傅

#2 Created at ... [Delete] [Delete and Lock User]

个人理解是 对于这样的批量常量,定义一个类去涵盖它们

from enum import Enum

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

作者举得这个例子中,Month就是类,继承自Enum() 而Jan,Feb,Mar……Nov,Dec这12个常量就是Month类的成员 每个常量都有固定的数字(默认情况下从1开始递增) 所以也可以理解为Month类的每一个唯一实例

所以个人认为Enum-Month-Jan的逻辑关系可以看作是: 父类 - 子类 - 实例

nintendoD_Jr

#3 Created at ... [Delete] [Delete and Lock User]

要搞清楚这里面的逻辑关系就必须知道在定义一个Class,继承Enum的时候做了什么,先不要管那个unique装饰器,那个是用来去掉enum里的重复元素用的,先看看Enum里定义的members这个前后都带两个下划线的特殊方法,这个方法用property装饰器, 返回一个MappingProxyType,传入了cls.member_map cls是指类对象,这个不明白也不用去深究,看一下第二个代码段里对member_map的这个赋值操作, 使用OrderedDict对这个属性去进行初始化。那么就说明members返回的是一个OrderedDict对象,

 @property
    def __members__(cls):
        """Returns a mapping of member name->value.

        This mapping lists all enum members, including aliases. Note that this
        is a read-only view of the internal mapping.

        """
        return MappingProxyType(cls._member_map_)
enum_class._member_map_ = OrderedDict()      # name->value map
mappingproxy(OrderedDict([('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>)]))

这个OrderedDict是一种有序字典,由Dict类派生而来,看下面的代码打印出来的内容,希望会对你理解有帮助

for a,b in Weekday.__members__.items():
        print(a, b, b.name, b.value , b.__dict__)

        #打印b的字典,这里就不都粘贴出来了

Output:  
Sun Weekday.Sun Sun 0 {'_name_': 'Sun', '__objclass__': <enum 'Weekday'>, '_value_': 0}
Mon Weekday.Mon Mon 1 {'_name_': 'Mon', '__objclass__': <enum 'Weekday'>, '_value_': 1}
Tue Weekday.Tue Tue 2 {'_name_': 'Tue', '__objclass__': <enum 'Weekday'>, '_value_': 2}

  • 1

Reply