3

我将如何创建由多个基类/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),以允许用户右键单击类名并选择一个选项以打开一个选项卡,并显示扁平类以供参考。

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

4

1 回答 1

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__and __doc__,这个实现只是忽略它们。

于 2012-11-15T06:34:15.040 回答