如何在我的元类中获取类的父类?

Posted

技术标签:

【中文标题】如何在我的元类中获取类的父类?【英文标题】:How to get parent classes of class in my meta class? 【发布时间】:2015-01-27 19:58:32 【问题描述】:

我有following script:

#!/usr/bin/python3

class MyMeta(type):
    def __new__(mcs, name, bases, dct):
        print(name + " " + str(bases))
        return super(MyMeta, mcs).__new__(mcs, name, bases, dct)


class A(metaclass=MyMeta):
    def foo(self):
        pass


class B(A):
    pass


class C(B):
    def foo(self):
        pass


def main():
    pass


if __name__ == "__main__":
    main()

我得到以下输出:

A ()
B (<class '__main__.A'>,)
C (<class '__main__.B'>,)

但我期待它:

A ()
B (<class '__main__.A'>,)
C (<class '__main__.B'>, <class '__main__.A'>)

我哪里出错了?

【问题讨论】:

【参考方案1】:

bases 参数列表在类定义中列出的基类。

好像你想要class.mro:

class MyMeta(type):
    def __new__(mcs, name, bases, dct):
        ret = super(MyMeta, mcs).__new__(mcs, name, bases, dct)
        print(name + " " + str(ret.mro()[1:-1]))
        return ret

【讨论】:

感谢您的回答和解释。

以上是关于如何在我的元类中获取类的父类?的主要内容,如果未能解决你的问题,请参考以下文章

java如何调用父类的父类中被覆盖的方法

Ruby - 在 ruby​​ 类的元类中定义 self 方法

获取派生类以显示与派生类的父类具有聚合关系的抽象类中的变量的 C++ 错误

从它的元类python引用一个类的实例

Python入门精华-OOP调用父类的方法及MRO方法解析序列

使用 Boost.Python 设置包装类的元类