起步
創(chuàng)新互聯(lián)建站專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,成都IDC機(jī)房托管,成都IDC機(jī)房托管,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。上一篇 《Python 的枚舉類型》 文末說有機(jī)會的話可以看看它的源碼。那就來讀一讀,看看枚舉的幾個重要的特性是如何實現(xiàn)的。
要想閱讀這部分,需要對元類編程有所了解。
成員名不允許重復(fù)
這部分我的第一個想法是去控制 __dict__ 中的 key 。但這樣的方式并不好,__dict__ 范圍大,它包含該類的所有屬性和方法。而不單單是枚舉的命名空間。我在源碼中發(fā)現(xiàn) enum 使用另一個方法。通過 __prepare__ 魔術(shù)方法可以返回一個類字典實例,在該實例 使用 __prepare__ 魔術(shù)方法自定義命名空間,在該空間內(nèi)限定成員名不允許重復(fù)。
# 自己實現(xiàn) class _Dict(dict): def __setitem__(self, key, value): if key in self: raise TypeError('Attempted to reuse key: %r' % key) super().__setitem__(key, value) class MyMeta(type): @classmethod def __prepare__(metacls, name, bases): d = _Dict() return d class Enum(metaclass=MyMeta): pass class Color(Enum): red = 1 red = 1 # TypeError: Attempted to reuse key: 'red'