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

(如果我想知道它的父类,我会做cls.__mro__.有这样的东西来获得元类吗?)

推荐答案

好吧,一个类的元类就是它自己的"类型",可以由

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

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

一做

class A(object):
    __metaclass__ = MyMeta

__metaclass__属性在实际类even if the actual metaclass is another one中设置为该值.

考虑:

def class_pre_decorator(name, bases, namespace):
     # do something with namespace
     return type(name, bases, namespace)

这是一个可以在Python2和Python3的元类声明中使用的可调用函数,它是有效的.解析后,两种情况下的实际元类都将是type.然而,在Python 2中.x、 cls.__metaclass__将指向可调用的class_pre_decorator,甚至tough type(cls)返回type,这是正确的元类.(请注意,以这种方式使用可调用项,当类进一步子类化时,它们不会被再次使用)

在Python3中,如果一个类没有给出其他使用该类的提示(比如在该类上设置属性),就无法猜测实际用于实例化该类的可调用项:

# python 2
class A(object):
   __metaclass__ = class_pre_decorator

在控制台上:

In [8]: type(A)
Out[8]: type

In [9]: A.__metaclass__
Out[9]: <unbound method A.class_pre_decorator>

# Python 3
class A(metaclass=class_pre_decorator):
    pass

试着读A.__metaclass__只会引起一个属性错误.

Python-3.x相关问答推荐

Python网页抓取:代码输出:汤未定义

S的两极是什么,相当于大Pandas 的`.ilo‘方法?

无法使用Python发送带有参数和标头的POST请求

无法导入名称';核心';来自部分初始化的模块';tensorflow_datasets';(很可能是由于循环导入)

类变量的Python子类被视为类方法

Django 模型类方法使用错误的 `self`

在 python f-string 中使用 \u

类型提示和链式赋值以及多重赋值

python 3:如何判断一个对象是否是一个函数?

预分配一个无列表

如何判断一个字符串是否包含有效的 Python 代码

如何将 SimpleGUI 与 Python 2.7 和 3.0 shell 集成

通过多个键对字典列表进行分组和聚合

是否在未完成初始化的对象上调用了 del?

如何使用 python 库连接到 poloniex.com websocket api

Pruning in Keras

Python:&= 运算符

带有自定义标头的 urllib.urlretrieve

用 Anaconda 安装了一个包,无法在 Python 中导入

新项目:Python 2 还是 Python 3?