基于其MRO创建类的展平表示

时间:2012-11-15 05:59:49

标签: python

如何创建由多个基类/ mixin组成的类的展平表示。有没有图书馆做这样的事情?例如:

class Foo(object):
    def a(self):
        return 

class Bar(object):
    def b(self):
        return

class Baz(Foo, Bar):
    pass

我希望能够创建扁平化类的文本表示,如下所示:

class Baz(object):
    def a(self):
        return

    def b(self):
        return

我们的想法是创建一个文本编辑器插件(在我的例子中是ST2),允许用户右键单击一个类名,然后选择一个选项,打开一个选项卡,显示展平类以供参考。

当然,该工具需要足够聪明才能将超级呼叫视为基本包含。

1 个答案:

答案 0 :(得分:0)

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')

然后:

>>> 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')

您需要决定要对__repr____doc__等成员做什么,此实现只是忽略它们。