gpt4 book ai didi

python - 如何确定一个类的元类?

转载 作者:太空狗 更新时间:2023-10-29 20:22:27 26 4
gpt4 key购买 nike

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

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

最佳答案

好的 - 所以,一个类的元类只是它自己的“类型”,可以由type(cls) 和其他方式,例如 cls.__class__

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

但是,用于在 Python 2.x 中创建元类的语法会产生一个值得注意的副作用。

做完

class A(object):
__metaclass__ = MyMeta

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

考虑:

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

这是一个可以在 Python 2 和 3 的元类声明中使用的可调用对象 - 它是有效的。解析后,两种情况下的实际元类都将只是type。但是,在 Python 2.x 中,cls.__metaclass__ 将指向可调用的 class_pre_decorator,即使是强硬的 type(cls) 也会返回 type ,这是正确的元类。(请注意,以这种方式使用可调用对象,当类被进一步子类化时,它们将不会被再次使用)

在 Python 3 中没有办法猜测实际用于实例化一个类的可调用对象,如果它没有给出其他提示(比如在类上设置一个属性)的话:

# 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__ 只会引发 AttributeError。

关于python - 如何确定一个类的元类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43853737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com