您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

有没有一种方法可以在类定义之后设置元类?

有没有一种方法可以在类定义之后设置元类?

您可以在创建类之后更改元类,就像更改对象的类一样,但是会遇到很多问题。对于初学者,初始元类必须与type__init__以及__new__元类的和都不会被调用(尽管您可以手动调用__init__或执行__init__s的方法 )。

更改元类的最麻烦的方法可能是从头开始重新创建该类:

B = MetaClass(B.__name__, B.__bases__, B.__dict__)

但是,如果您坚持动态更改元类,则首先需要使用临时自定义类定义B:

class _TempMetaclass(type):
    pass

class B:
    __Metaclass__ = _TempMetaclass # or: type('temp', (type, ), {})

然后,您可以像这样定义元类

class MetaClass(type):
    def __init__(cls, *a, **kw):
        super(MetaClass, cls).__init__(*a, **kw)
        cls._actual_init(*a, **kw)
    def _actual_init(cls, *a, **kw):
        # actual initialization goes here

后执行以下操作:

B.__class__ = MetaClass
MetaClass._actual_init(B, B.__name__, B.__bases__, B.__dict__)

您还需要确保已完成该类的所有初始化_actual_init。您也可以classmethod元类添加,以为您更改元类

两种解决方案都有一个缺点,即B的基数会受到限制-它们必须与原始和新的元类都兼容,但是我想这对您来说不是问题。

其他 2022/1/1 18:46:18 有439人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶