【发布时间】:2017-10-04 21:59:34
【问题描述】:
注意 这个问题与 Python 3 Enum 数据类型无关,这只是我正在使用的示例。
使用PEP 3115,Python 3 将__prepare__1 方法添加到type,以便在创建类时允许使用自定义命名空间。例如,新的Enum 数据类型使用__prepare__ 返回私有_EnumDict 的实例,用作新的Enum 类的命名空间。
但是,我已经看到几个关于 SO2 的 EnumMeta 被子类化的示例,在元类 __new__ 方法中为该类创建一个新的命名空间,而不是调用 __prepare__获取该新命名空间的方法,改为使用type(clsdict)()。这样做有什么风险吗?
1__prepare__的签名:
@classmethod
def __prepare__(metacls, cls, bases, **kwds):
对于__new__:
def __new__(metacls, cls, bases, clsdict, **kwds):
2 使用type(clsdict)的示例:
class CountryCodeMeta(enum.EnumMeta):
def __new__(metacls, cls, bases, classdict):
data = classdict['data']
names = [(country['alpha-2'], int(country['country-code'])) for country in data]
--> temp = type(classdict)()
for name, value in names:
temp[name] = value
excluded = set(temp) | set(('data',))
temp.update(item for item in classdict.items() if item[0] not in excluded)
return super(CountryCodeMeta, metacls).__new__(metacls, cls, bases, temp)
【问题讨论】:
标签: python python-3.x metaclass