Python 为什么我要使用uu prepare uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;名称空间?

Python 为什么我要使用uu prepare uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;名称空间?,python,python-3.x,metaclass,Python,Python 3.x,Metaclass,注意这个问题不是关于Python3Enum数据类型的,它只是我正在使用的示例 Python3在type中添加了1方法,以允许在创建类时使用自定义名称空间。例如,新的Enum数据类型使用\uuuuu prepare\uuuuu返回私有\u EnumDict的实例,以用作新的Enum类的命名空间 然而,我在SO2上看到了几个例子,其中EnumMeta被子类化,在元类\uuuuuu new\uuuuu方法中为类创建了一个新名称空间,但是没有调用\uuuuu prepare\uuuuu方法来获取新名称空

注意这个问题不是关于Python3
Enum
数据类型的,它只是我正在使用的示例

Python3在
type
中添加了1方法,以允许在创建类时使用自定义名称空间。例如,新的
Enum
数据类型使用
\uuuuu prepare\uuuuu
返回私有
\u EnumDict
的实例,以用作新的
Enum
类的命名空间

然而,我在SO2上看到了几个例子,其中
EnumMeta
被子类化,在元类
\uuuuuu new\uuuuu
方法中为类创建了一个新名称空间,但是没有调用
\uuuuu prepare\uuuuu
方法来获取新名称空间,而是使用了
类型(clsdict)(
。这样做有风险吗


1.
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

@classmethod
def __prepare__(metacls, cls, bases, **kwds):
def __new__(metacls, cls, bases, clsdict, **kwds):
对于
\uuuu new\uuuuu

@classmethod
def __prepare__(metacls, cls, bases, **kwds):
def __new__(metacls, cls, bases, clsdict, **kwds):

2使用
类型(clsdict)
的示例:

是的,有风险

通过调用
\uu prepare\uu
而不是执行
type(clsdict)(
)来获取新名称空间,至少有两个原因:

  • 在Python2上运行时,
    clsdict
    是一个
    dict
    ,而原始的
    \uuuu prepare\uuuu
    从未运行过(
    \uuuu prepare\uuuuu
    仅是Python3)——换句话说,如果
    \uu prepare\uuuu
    返回的是正常dict之外的内容,
    type(clsdict)(
    将无法获取它

  • 当使用
    类型(clsdict)(
    )时,将不会设置
    clsdict
    上的
    \uuuuuuu prepare\uuuuuu
    设置的任何属性;i、 e.如果
    \uuuu prepare\uuuu
    没有
    clsdict.spam='eggs'
    ,那么
    type(clsdict)(
    将没有
    spam
    属性。请注意,这些属性位于命名空间本身上,供元类使用,并且在命名空间中不可见

总而言之:有充分的理由使用
\uuu prepare\uuu()
来获取正确的类词典,而
类型(clsdict)(
快捷方式则没有