gpt4 book ai didi

Python 默认元类

转载 作者:行者123 更新时间:2023-11-28 21:58:51 27 4
gpt4 key购买 nike

是否有可能以某种方式配置 python 模块或 REPL 以对所有定义的类使用默认元类,而不管类中是否使用元类?

class met(type):
def __init__(cls, name, bases, dct):
super(met, cls).__init__(name, bases, dct)
setattr(cls, "_test_member", "test_value")

class A(object):
pass

>>> A._test_member
'test_value'

最佳答案

使用 Pavel Anossov(现已删除)的评论:

class met(type):
def __init__(cls, name, bases, dct):
super(met, cls).__init__(name, bases, dct)
cls._test_member = "test_value"

object = met('object', (object,), {})

class A(object):
pass

print(A._test_member)

打印

test_value

请注意,一个类只能有一个元类。 (毕竟,任何对象都只能有一种类型)。但另外,一个类的元类必须是其所有基类的元类的(非严格的)子类。换句话说,该类的元类及其所有基类的元类必须相同,或者所有这些元类必须互为子类。因此,如果一个类试图使用不是 met 子类的元类,则上述解决方案可能不起作用。

例如,

class met(type):
def __init__(cls, name, bases, dct):
super(met, cls).__init__(name, bases, dct)
cls._test_member = "test_value"

object = met('object', (object,), {})

class someothertype(type): pass

class B(object):
__metaclass__ = someothertype

加注

TypeError: Error when calling the metaclass bases
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

关于Python 默认元类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17480367/

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