关于python元类遇到冲突问题的问题(Metaclass conflict)?

发布于 09-02 01:26 字数 632 浏览 16 评论 0

from abc import ABCMeta
class test1(object):
    __metaclass__ = ABCMeta 
    def test1(self):
        print 'test1'
    
class UpperAttrMetaclass(type):
    def __new__(cls, name, bases, dct={}):
        a = super(UpperAttrMetaclass, cls).__new__(cls, name, bases, dct)
        return a
    
b = UpperAttrMetaclass('hehe',(test1,),{})()

会报错如下:TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

如果将test1中的__metaclass__ = ABCMeta去掉就能运行。但是不想去掉,如何在以上基础上解决呢?(程序是在运行时动态决定继承哪些类,继承的类名和数量都不一定)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月竹挽风2022-09-09 01:26:31

针对这个代码解释错误信息:“B的metaclass必须是所有B的父类(这里只有test1)的metaclass的子类(但不一定要求是直接子类)”。

从字面上理解就可以找到解决办法:

class bMetaClass(ABCMeta, UpperAttrMetaclass):
    pass

b = bMetaClass('hehe', (test1,), {})()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文