3

複数の基本クラス/ミックスインで構成されるクラスのフラット化された表現を作成するにはどうすればよいですか。そのようなことをするためのライブラリはありますか?例えば:

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

私の知る限り、これを行うほとんどのツールは、コードを実行し、定義されたクラスに問い合わせることによってそれを行います。簡単な実装は次のようになります。

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__、この実装ではそれらを無視します。

于 2012-11-15T06:34:15.040 に答える