Python 为什么我要使用uu prepare uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;名称空间?
注意这个问题不是关于Python3Python 为什么我要使用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方法来获取新名称空
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)(
快捷方式则没有