如何确定类的元类?

我有一个类对象,cls。我想知道它的元类。我该怎么做

(如果我想知道它的父类,我会做cls.\uuuumro\uuuuuu。有这样的东西来获取元类吗?)

好的-那么,一个类的元类就是它自己的“类型”,可以由
类型(cls)和其他方式,如cls.\uuuuuu class\uuuuuu

在Python3.x中没有进一步的歧义——因为创建元类的语法只是在类声明语句中将其作为命名参数传递

然而,在Python2.x中用于创建元类的语法产生了一个值得注意的副作用

一做

A类(对象):
__元类\我的元

\uuuuuuuuu元类属性在实际类中设置为该值,即使实际元类是另一个元类

考虑:

def class_pre_decorator(名称、基、命名空间):
#对名称空间做些什么
返回类型(名称、基、命名空间)

这是一个可调用函数,可以在Python2和Python3的元类声明中使用,并且是有效的。解析后,两种情况下的实际元类都将是类型。然而,在Python2.x中,cls.\uuuuu元类\uuuuuuu将指向可调用的class\u pre\u decorator,甚至是难处理的type(cls)返回type,这是正确的元类。(注意,以这种方式使用可调用项,当类进一步子类时,它们将不会被再次使用)

在Python3中,如果没有其他提示(如在类上设置属性),则无法猜测实际用于实例化类的可调用对象:

python 2
A类(对象):
__元类=类预装饰器

在控制台上:

[8]on

:键入(A)
Out[8]:类型
[9]on 一个元类__
Out[9]:<未绑定方法A.class\u pre\u decorator>

Python 3
A类(元类=类预装饰器):
通过

尝试读取A.\uuuu元类\uuuuu只会引发AttributeError

发表评论