Python 基于类的MRO创建类的展开表示

Python 基于类的MRO创建类的展开表示,python,Python,如何创建由多个基类/混合组成的类的扁平表示。有做这种事的图书馆吗?例如: 类Foo(对象): def a(自我): 返回 类栏(对象): def b(自我): 返回 Baz级(Foo、Bar): 通过 我希望能够创建展平类的文本表示形式,如下所示: 类Baz(对象): def a(自我): 返回 def b(自我): 返回 其想法是创建一个文本编辑器插件(在我的例子中是ST2),允许用户右键单击类名并选择一个选项,打开一个选项卡,显示扁平的类以供参考 当然,该工具需要足够智能,才能将超级调用

如何创建由多个基类/混合组成的类的扁平表示。有做这种事的图书馆吗?例如:

类Foo(对象):
def a(自我):
返回
类栏(对象):
def b(自我):
返回
Baz级(Foo、Bar):
通过
我希望能够创建展平类的文本表示形式,如下所示:

类Baz(对象):
def a(自我):
返回
def b(自我):
返回
其想法是创建一个文本编辑器插件(在我的例子中是ST2),允许用户右键单击类名并选择一个选项,打开一个选项卡,显示扁平的类以供参考


当然,该工具需要足够智能,才能将超级调用视为基本包括。

AFAIK,大多数实现这一点的工具都是通过执行代码和查询定义的类来实现的。一个简单的实现可能是:

import inspect
import textwrap

def print_def(cls):
    print('class %s:' % cls.__name__)
    for name, member in inspect.getmembers(cls):
        if not name.startswith('__') and member is not None:
            source = inspect.getsource(member)
            source = textwrap.dedent(source)
            for l in source.split('\n'):
                print('    %s' % l)
为了说明这一点,假设您正在查询的文件包含以下定义:

class A:
    def a_method(self):
        self.a = 4
        return self.a

    def overridden(self):
        print('This is A')

class B:
    def b_method(self):
        print([1, 2, 3])
        return 4

class C(A, B):
    def c_method(self):
        pass

    def overridden(self):
        print('This is C')
然后:


您需要决定希望它对成员(如
\uuuuu repr\uuuuu
\uuu doc\uuuu
)执行什么操作,此实现只会忽略它们。

您希望它如何显示覆盖的方法?比如,如果Foo和Baz都定义了相同的方法(Baz覆盖了Foo版本)?如果两个基类共享相同的方法名,那么使用MRO来确定哪个方法优先。如果“包含”是指您希望继承方法的源代码被直接粘贴到子类方法中,这是一个很高的要求。这可能是可以做到的,但您必须使用
inspect
模块获取每个函数的源代码,然后自己将字符串粘贴在一起(处理任何缩进不匹配等),因此为什么我要问是否已经完成了,这样我就不会拔出剩余的头发:)包括特性是一个非常高的要求,因为类不需要在相同的文件中定义——因此,它们甚至不共享相同的全局范围。如果超类引用了全局范围中不在当前范围内的变量,那么应该为该变量显示什么?仅仅显示变量的名称充其量也会让人感到困惑。。。
>>> vars = {}
>>> execfile('myfile.py', {}, vars)
>>> print_def(vars['C'])
class C:
    def a_method(self):
        self.a = 4
        return self.a

    def b_method(self):
        print([1, 2, 3])
        return 4

    def c_method(self):
        pass

    def overridden(self):
        print('This is C')